使用Java套接字时关闭什么

vojdkbi0  于 2023-03-28  发布在  Java
关注(0)|答案(1)|浏览(122)

所以我有这个使用Java套接字的类:

public class Connection {
    private final Socket socket;

    private final PrintWriter out;
    private final BufferedReader in;

    private final ObjectOutputStream objectOut;
    private final ObjectInputStream objectIn;

    public Connection(Socket socket) throws IOException {
        this.socket = socket;
        this.out = new PrintWriter(socket.getOutputStream(), true);
        this.in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        this.objectOut = new ObjectOutputStream(socket.getOutputStream());
        this.objectIn = new ObjectInputStream(socket.getInputStream());
    }

    public void close() throws IOException {
        socket.close();
        out.close();
        in.close();
        objectOut.close();
        objectIn.close();
    }
    
    @Override
    public String toString() {
        return socket.getInetAddress() + ":" + socket.getPort();
    }
}

在close方法中,当socket.close()被调用时,我真正需要关闭的是什么?

pbpqsu0x

pbpqsu0x1#

首先,让我设置2个关于对象流的警报...

  1. ObjectOutputStream会发送一些需要刷新的字节,而ObjectInputStream需要读取一些字节才能完成。在套接字上使用对象流时,很容易挂起。
    1.根据设计,对象流有一个已经发送的对象的内存,如果不使用outputstream.reset(),那么服务器和客户端的内存将无限增长。
    现在,关闭流在相应的流上附加TCP FIN(基本上是flush和end)。这就是半关闭的套接字。如果你在stream close()之前socket.close(),它会发送一个TCP RST,这是一个苛刻的断开连接,对等端可能无法获得所有的字节,如果试图在尚未关闭的outputstream上写入,也可能会遇到“断管”。

相关问题