我有一个我设置的服务器套接字,以及一个连接到服务器套接字的客户端套接字。
按照以下顺序:
- 我打开一个从客户端到服务器的 ObjectOutputStream
- 在服务器上,我从客户端接受的套接字连接打开一个 ObjectInputStream
- 在服务器上,我使用从客户端接受的套接字连接打开一个 ObjectOutputStream
- 在客户端我打开一个 ObjectInputStream
一切正常,没有错误。 在服务器上的循环中,我有以下内容
while(true) {
Map<Integer,Game> games = GameEngine.getGames();
System.out.println("Games is: " + games + " size is " + games.size());
secondaryOutputStream.writeObject(games);
secondaryOutputStream.flush();
// sleep for 2 seconds then send the games again
try {
Thread.currentThread().sleep(4000);
} catch (InterruptedException ie) {
ie.printStackTrace();
}
secondaryOutputStream是服务端到客户端的ObjectOutputStream。 我在这里做的是给客户写一张 map 。如您所见,我使用相同的 ObjectOutputStream 在循环中重复执行此操作。
无一异常(exception),所以所有的联系都是健全的。但是,在客户端,在与服务器建立套接字连接后,我只收到一次 map 。如果 map 已更新并写入客户端,当服务器首先将 map 写入客户端时,我仍然会看到原始 map 值。你能以这种方式重用对象流吗?真的谢谢
最佳答案
ObjectOutputStream 具有节省空间(和身份保留)的功能,它会跟踪以前发送的对象(基于对象身份),并且不会重新发送它们。相反,它只是发送一个标记,指示它之前发送了哪个对象,而 ObjectInputStream(保留所有已发送对象的句柄)只是在另一端重新返回该对象。您需要在每次发送之间使用 ObjectOutputStream.reset()
以便完全重新发送对象。您也可以使用 ObjectOutputStream.writeUnshared()
,但这可能无法完全满足您的需要。
关于java - 重用套接字流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5538379/