套接字在多次转移时提前关闭

时间:2015-10-15 11:18:48

标签: java sockets

我试图通过网络将对象发送到另一台计算机(或同一台计算机),然后让所述计算机发回一个对象。

在发送计算机上,我发送对象并接收返回的对象:

ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
        objectOutputStream.writeObject(object);
        Object returnedObject;
        socket.setSoTimeout(timeout);
        try (ObjectInputStream ois = new ObjectInputStream(socket.getInputStream())) {
            returnedObject = (Object) ois.readObject();
        }
        return returnedObject;

在接收计算机上,我收到了对象:

Object object;
        socket.setSoTimeout(timeout);
        try (ObjectInputStream ois = new ObjectInputStream(socket.getInputStream())) {
            object = (Object) ois.readObject();
        }
        return object;

然后发回一个对象:

socket.setSoTimeout(timeout);
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
        objectOutputStream.writeObject(object);

我得到的错误是:

  

SEVERE:null java.net.SocketException:Socket关闭   

的java.net.Socket.setSoTimeout(Socket.java:1137)

并且在尝试在接收计算机上发回对象时发生。

发送计算机上的套接字使用与接收计算机上的套接字相同的地址和端口。

2 个答案:

答案 0 :(得分:2)

此异常表示关闭了套接字,然后继续使用它。具体来说,您在声明它的try-with-resources块的末尾关闭了ObjectInputStream。这将关闭套接字的另一个流和套接字本身。

每次传输不要使用新的对象流。在两端使用相同的插座寿命。

答案 1 :(得分:0)

您正在使用非常小范围的资源尝试:

try (ObjectInputStream ois = new ObjectInputStream(socket.getInputStream())) {
    returnedObject = (Object) ois.readObject();
}

此代码解释为:

  • 获取输入流并在其周围构建ObjectInputStream
  • 从对象流中读取对象
  • 关闭 ObjectInputStream

当你关闭ObjectInputStream时,它会自动关闭支持它的InputStream,这是套接字的输入流。 documentation of getInputStream说:

  

关闭返回的InputStream将关闭相关的套接字。

您应该确保try-with-resources具有覆盖套接字整个生命周期的更大范围,或者避免使用try-with-resources并确保在完成后正确关闭ObjecInputStream有它或出现错误。