重用套接字流

时间:2011-04-04 12:23:00

标签: java sockets

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

按以下顺序:

  1. 我从客户端打开ObjectOutputStream到服务器
  2. 在服务器上,我从客户端
  3. 接受的套接字连接打开一个ObjectInputStream
  4. 在服务器上,我使用客户端
  5. 中接受的套接字连接打开ObjectOutputStream
  6. 在客户端上,我打开一个ObjectInputStream
  7. 一切正常,没有错误。 在服务器上的循环中,我有以下

    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在循环中重复执行此操作。

    没有例外,因此所有连接都是合理的。但是,在客户端,在与服务器建立套接字连接后,我只收到一次映射。如果地图已更新并写入客户端,则当服务器第一次将地图写入客户端时,我仍会看到原始地图值。你能以这种方式重用对象流吗?非常感谢

1 个答案:

答案 0 :(得分:6)

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