【问题标题】:reusing socket streams重用套接字流
【发布时间】:2011-07-29 03:29:01
【问题描述】:

我有一个我设置的服务器套接字,以及一个连接到服务器套接字的客户端套接字。

按以下顺序:

  1. 我打开一个从客户端到服务器的 ObjectOutputStream
  2. 在服务器上,我从客户端接受的套接字连接打开一个 ObjectInputStream
  3. 在服务器上,我使用客户端接受的套接字连接打开一个 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 在循环中重复执行此操作。

没有例外,所以所有的连接都是可靠的。但是,在客户端,在与服务器建立套接字连接后,我只收到一次地图。如果地图被更新并写入客户端,当服务器首先将地图写入客户端时,我仍然会看到原始地图值。你能以这种方式重用对象流吗?真的很感谢

【问题讨论】:

    标签: java sockets


    【解决方案1】:

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

    【讨论】:

    • 这解决了我的问题。我打电话给'reset()',它工作得很好。非常感谢您!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 2012-04-03
    相关资源
    最近更新 更多