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