我有一个我设置的服务器套接字,以及一个连接到服务器套接字的客户端套接字。
按以下顺序:
一切正常,没有错误。 在服务器上的循环中,我有以下
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在循环中重复执行此操作。
没有例外,因此所有连接都是合理的。但是,在客户端,在与服务器建立套接字连接后,我只收到一次映射。如果地图已更新并写入客户端,则当服务器第一次将地图写入客户端时,我仍会看到原始地图值。你能以这种方式重用对象流吗?非常感谢
答案 0 :(得分:6)
ObjectOutputStream具有节省空间(和身份保留)功能,可以跟踪先前发送的对象(基于对象标识),并且不会重新发送它们。相反,它只是发送一个标记,指示它先前发送了哪个对象,而ObjectInputStream(保留了所有发送对象的句柄)只是在另一端重新返回该对象。您需要在每次发送之间使用ObjectOutputStream.reset()
,以便完全重新发送该对象。您也可以使用ObjectOutputStream.writeUnshared()
,但这可能无法完全满足您的需求。