我正在制作一个客户端服务器应用程序,在读取服务器上的对象时遇到了一些麻烦。

服务器连接到客户端套接字后,我将建立对象输入和输出流,并将其传递给service()方法。在那儿,我应该处理来自客户端的各种消息。我可以从客户端(即我设计的Message对象)获得一条消息。但是,当然,我想做的是有一个循环,这样我可以获取一条消息,对其进行处理并进行回复。

到目前为止,我的代码仅适用于一条消息。当我添加循环时,发生的是每次迭代,我的服务器只是在我的客户端有机会通过套接字发送新消息之前一遍又一遍地读取相同的消息(我认为至少是这样) 。

因此,我真正需要做的是弄清楚如何使service()方法等待新输入。有任何想法吗?还是我要解决这个错误?我是否需要在每次迭代或...上创建一个新的OIS?一些代码:

public void service(ObjectInputStream input, ObjectOutputStream output) throws IOException, Exception {

    _shouldService = true;

    while (_shouldService) {
                    // It just keeps reading the same message over and over
                    // I need it to wait here until the client sends a new message
                    // Unless I'm just approaching this all wrong!
        NetworkMessage message = (NetworkMessage) input.readObject();

        NetworkMessageHeader header = message.getHeader();

        String headerType = header.getType();

        if (headerType.equals(NetworkMessageHeader.NetworkMessageHeaderTypeConnect)) {
            doLoginForMessage(message, output);
        } else if (headerType.equals(NetworkMessageHeader.NetworkMessageHeaderTypeFiles)) {
            doFilesList(message, output);
        } else {
            System.out.println("Unrecognized header type: " + headerType);

        }
    }
}

最佳答案

ObjectOutputStream缓存对象表示,并且不会检测是否从客户端一次又一次地重新发送同一实例,但是有更改。如果是这种情况,则需要在每次发送之前在流上调用reset

NetworkMessage message = new NetworkMessage();
for(;;) {
  message.setProperty(whatever);
  oos.reset();
  oos.writeObject(message);
}

10-08 06:59