Java ObjectOutputstream/ObjectInputStream不每次发送

Java ObjectOutputstream/ObjectInputStream不每次发送,java,networking,serialization,stream,Java,Networking,Serialization,Stream,我是网络编程新手,正在用java编写聊天程序。我第一次使用DataOutputStream,它工作得很好,但我认为如果我使用对象流,它会更整洁,使我能够发送用户信息。问题是ObjectOutPutStream并不是每次都为我发送。事实上,它有规律地每三次发送一次。与处理服务器的消息相同,客户端每三次接收一次消息 下面是一些代码: 客户端: public void start() throws IOException{ output = new ObjectOutputStream(so

我是网络编程新手,正在用java编写聊天程序。我第一次使用DataOutputStream,它工作得很好,但我认为如果我使用对象流,它会更整洁,使我能够发送用户信息。问题是ObjectOutPutStream并不是每次都为我发送。事实上,它有规律地每三次发送一次。与处理服务器的消息相同,客户端每三次接收一次消息

下面是一些代码:

客户端:

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打印实际异常

这个问题可能需要一个体面的解决方案