有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java重用socket流

我有一个我设置的服务器socket和一个连接到服务器socket的客户端socket

按以下顺序:

  1. 我打开一个从客户端到服务器的ObjectOutputStream
  2. 在服务器上,我从客户端接受的socket连接打开ObjectInputStream
  3. 在服务器上,我使用客户端接受的socket连接打开ObjectOutputStream
  4. 在客户端上,我打开一个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) 个答案

  1. # 1 楼答案

    ObjectOutputStream具有节省空间(和保留身份)的功能,它可以跟踪以前发送的对象(基于对象身份),而不会重新发送它们。相反,它只发送一个标记,指示它之前发送了哪个对象,ObjectInputStream(它保留了所有发送对象的句柄)只在另一端重新返回该对象。您需要在每次发送之间使用ObjectOutputStream.reset(),这样对象将完全重新发送。您也可以使用ObjectOutputStream.writeUnshared(),但这可能无法完全满足您的需要