Java ObjectOutputstream/ObjectInputStream不每次发送
我是网络编程新手,正在用java编写聊天程序。我第一次使用DataOutputStream,它工作得很好,但我认为如果我使用对象流,它会更整洁,使我能够发送用户信息。问题是ObjectOutPutStream并不是每次都为我发送。事实上,它有规律地每三次发送一次。与处理服务器的消息相同,客户端每三次接收一次消息 下面是一些代码: 客户端:Java ObjectOutputstream/ObjectInputStream不每次发送,java,networking,serialization,stream,Java,Networking,Serialization,Stream,我是网络编程新手,正在用java编写聊天程序。我第一次使用DataOutputStream,它工作得很好,但我认为如果我使用对象流,它会更整洁,使我能够发送用户信息。问题是ObjectOutPutStream并不是每次都为我发送。事实上,它有规律地每三次发送一次。与处理服务器的消息相同,客户端每三次接收一次消息 下面是一些代码: 客户端: public void start() throws IOException{ output = new ObjectOutputStream(so
public void start() throws IOException{
output = new ObjectOutputStream(socket.getOutputStream());
if (thread == null) {
client = new ChatClientThread(this, socket);
thread = new Thread(this);
thread.start();
}
}
public void sendMessage(String msg){
try {
output.writeObject(new Message(msg));
output.flush();
}catch (IOException ioe) {
System.out.println("Sending error: " + ioe.getMessage());
stop();
}
}
服务器端:
public void run() {
System.out.println("Server Thread " + ID + " running.");
while (true) {
try {
if(streamIn.readObject() instanceof Message){
System.out.println((Message)streamIn.readObject());
server.handleMessage(ID, (Message)streamIn.readObject());
}
}catch (IOException ex) {
System.out.println("Listening error: " + ex.getMessage());
server.remove(ID);
} catch (ClassNotFoundException ex) {
System.out.println("Class was not found");
}
}
}
public void open() throws IOException {
streamOut = new ObjectOutputStream(socket.getOutputStream());
streamIn = new ObjectInputStream(socket.getInputStream());
}
你知道为什么会发生这种情况吗?我想你的问题是你从
ObjectInputStream
中读了多次,假设所有这些时间你都会得到相同的对象。但事实上,你正在失去它,读下一本
尝试按如下方式重写服务器代码:
System.out.println("Server Thread " + ID + " running.");
while (true) {
try {
Object message = streamIn.readObject();
if (message instanceof Message) {
System.out.println((Message) message);
server.handleMessage(ID, (Message) message);
}
} catch (IOException ex) {
System.out.println("Listening error: " + ex.getMessage());
server.remove(ID);
} catch (ClassNotFoundException ex) {
System.out.println("Class was not found");
}
}
请注意,消息如何在每个循环中仅读取一次,并存储在变量message
中,以便对其进行测试
此外,我还将添加带有日志消息的
else
块,由于某些原因,该块恰好不是消息的实例。并在catch
块中使用stacktrace打印实际异常 这个问题可能需要一个体面的解决方案