java重用socket流
我有一个我设置的服务器socket和一个连接到服务器socket的客户端socket
按以下顺序:
- 我打开一个从客户端到服务器的ObjectOutputStream
- 在服务器上,我从客户端接受的socket连接打开ObjectInputStream
- 在服务器上,我使用客户端接受的socket连接打开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。 我在这里做的是给客户写一张地图。正如您所见,我在一个循环中重复执行此操作,使用相同的ObjectOutputStream
没有例外,所以所有的连接都是可靠的。然而,在客户端,在与服务器建立socket连接后,我只接收一次映射。如果地图被更新并写入客户端,当服务器第一次将地图写入客户端时,我仍然可以看到原始地图值。你能以这种方式重用对象流吗?谢谢
# 1 楼答案
ObjectOutputStream具有节省空间(和保留身份)的功能,它可以跟踪以前发送的对象(基于对象身份),而不会重新发送它们。相反,它只发送一个标记,指示它之前发送了哪个对象,ObjectInputStream(它保留了所有发送对象的句柄)只在另一端重新返回该对象。您需要在每次发送之间使用
ObjectOutputStream.reset()
,这样对象将完全重新发送。您也可以使用ObjectOutputStream.writeUnshared()
,但这可能无法完全满足您的需要