Java 重用套接字流

Java 重用套接字流,java,sockets,Java,Sockets,我有一个我设置的服务器套接字和一个连接到服务器套接字的客户端套接字 按以下顺序: 我打开一个从客户端到服务器的ObjectOutputStream 在服务器上,我从客户端接受的套接字连接打开ObjectInputStream 在服务器上,我使用从客户端接受的套接字连接打开ObjectOutputStream 在客户端上,我打开一个ObjectInputStream 一切正常。 在服务器上的循环中,我有以下内容 while(true) { Map<Integer,Game> games

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

按以下顺序:

  • 我打开一个从客户端到服务器的ObjectOutputStream
  • 在服务器上,我从客户端接受的套接字连接打开ObjectInputStream
  • 在服务器上,我使用从客户端接受的套接字连接打开ObjectOutputStream
  • 在客户端上,我打开一个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();
    }
    
    while(true){
    Map games=GameEngine.getGames();
    System.out.println(“游戏是:“+Games+”大小是“+Games.size());
    secondaryOutputStream.writeObject(游戏);
    secondaryOutputStream.flush();
    //睡眠2秒钟,然后再次发送游戏
    试一试{
    Thread.currentThread().sleep(4000);
    }捕获(中断异常ie){
    即printStackTrace();
    }
    
    }

    secondaryOutputStream是从服务器到客户端的ObjectOutputStream。 我在这里做的是给客户写一张地图。如您所见,我在循环中重复执行此操作,使用相同的ObjectOutputStream


    没有例外,因此所有连接都是可靠的。但是,在客户端,在与服务器建立套接字连接之后,我只接收一次映射。如果映射被更新并写入客户端,当服务器第一次将映射写入客户端时,我仍然可以看到原始映射值。您能以这种方式重用对象流吗?感谢您,ObjectOutputStream确实具有节省空间(和保留身份)的功能,它可以跟踪以前发送的对象(基于对象身份),而不会重新发送它们。相反,它只发送一个标记,指示它以前发送的对象,而ObjectInputStream(保留所有发送对象的句柄)只在另一端重新返回该对象。您需要在每次发送之间使用
    ObjectOutputStream.reset()
    ,以便完全重新发送对象。您也可以使用
    ObjectOutputStream.writeUnshared()
    ,但这可能无法完全满足您的需要。

    解决了我的问题。我调用了“reset()”,它工作得非常好。非常感谢你!