所以我有这个使用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()被调用时,我真正需要关闭的是什么?
1条答案
按热度按时间pbpqsu0x1#
首先,让我设置2个关于对象流的警报...
1.根据设计,对象流有一个已经发送的对象的内存,如果不使用outputstream.reset(),那么服务器和客户端的内存将无限增长。
现在,关闭流在相应的流上附加TCP FIN(基本上是flush和end)。这就是半关闭的套接字。如果你在stream close()之前socket.close(),它会发送一个TCP RST,这是一个苛刻的断开连接,对等端可能无法获得所有的字节,如果试图在尚未关闭的outputstream上写入,也可能会遇到“断管”。