java - 重用套接字流

标签 java sockets

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

按照以下顺序:

  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。 我在这里做的是给客户写一张 map 。如您所见,我使用相同的 ObjectOutputStream 在循环中重复执行此操作。

无一异常(exception),所以所有的联系都是健全的。但是,在客户端,在与服务器建立套接字连接后,我只收到一次 map 。如果 map 已更新并写入客户端,当服务器首先将 map 写入客户端时,我仍然会看到原始 map 值。你能以这种方式重用对象流吗?真的谢谢

最佳答案

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

关于java - 重用套接字流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5538379/

相关文章:

java - 如何对构造函数进行单元测试

javascript - Vorlon.js 正在请求 Socket.io,但它的配置已经设置为包含 socket.io

c - 使用 C 套接字的接口(interface)上的环回数据包

java - Java中的多重加密技术

java - Activity 引擎: Task Event - User is null

java - (Java) 如何让数据库删除存储的值,直到该值已存储超过 5 次?

c# - 套接字缓冲区大小 : pros and cons of bigger vs smaller

java - WSDL4J 无法使用 Basichttpbinding 解析 wcf .net 服务响应

java.net.SocketTimeoutException 与 java.net.ConnectException

c - C 和 Go 之间的抽象 Unix 套接字