Java 套接字在多次传输时提前关闭

Java 套接字在多次传输时提前关闭,java,sockets,Java,Sockets,我试图通过网络将一个对象发送到另一台计算机(或同一台计算机),然后让计算机将对象发送回 在发送计算机上,我发送对象并接收返回的对象: ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream()); objectOutputStream.writeObject(object); Object returnedObject; socket

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

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

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);
我得到的错误是:

严重:null java.net.SocketException:套接字在关闭 java.net.Socket.setSoTimeout(Socket.java:1137)位于

它发生在尝试将对象发送回接收计算机时

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

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


每次传输时不要使用新对象流。在套接字的两端使用相同的套接字。

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

try (ObjectInputStream ois = new ObjectInputStream(socket.getInputStream())) {
    returnedObject = (Object) ois.readObject();
}
此代码被解释为:

  • 获取输入流并围绕它构建一个
    ObjectInputStream
  • 从对象流中读取对象
  • 关闭
    ObjectInputStream
当您关闭
ObjectInputStream
时,它会自动关闭支持它的
InputStream
,这是套接字的输入流。报告说:

关闭返回的
InputStream
将关闭关联的套接字

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