ObjectOutputstream / ObjectInputStream不是每次都发送

时间:2018-05-27 12:41:40

标签: java networking serialization stream

我是网络编程新手,我正在java中做一个聊天程序。我第一次使用DataOutputStream并且工作正常,但我认为如果我使用Object Streams会让我发送用户信息会更加整洁。问题是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());
}

为什么会发生这种情况?

1 个答案:

答案 0 :(得分:0)

我认为你的问题是你从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阻止记录消息,由于某种原因,该消息恰好不是Message的实例。并在catch块中使用stacktrace打印实际异常。