2012-02-21 27 views
5

我有一个客户端服务器应用程序,我在读服务器上的对象时遇到了一些麻烦。ObjectInputStream - 如何等待新数据?

在我的服务器连接到客户端套接字后,我建立对象输入和输出流并将它们传递给我的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); 

     } 
    } 
} 

回答

2

用ObjectOutputStream缓存对象表示,如果你正在一遍又一遍地从客户端重新发送相同的情况下不会察觉,但变化在里面。如果这是您的场景,则需要在每次发送前在流上调用reset

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

我得到了同样的问题,重置没有任何区别 – bubakazouba 2015-06-14 03:57:45

+0

@bubakazouba所以这不是同样的问题。 – EJP 2016-03-22 07:43:36