Socket.close()被认为是一种结束连接的干净方式吗?

时间:2016-12-31 15:35:44

标签: java sockets

正如标题所说 - 如果我想关闭套接字连接就足够了,如果我只是打电话给mySocket.close()?另一方会发生什么?

或者,如果它不是要走的路,那是什么?我是否必须通过套接字发送某种“完成”消息,以便另一方知道它也应该结束?

奖金问题:java文档说

  

关闭此套接字也将关闭套接字的InputStream和OutputStream。

那么单独关闭套接字还是我必须明确关闭流(假设我当然没有使用try-with-resources)?

2 个答案:

答案 0 :(得分:3)

关闭套接字不会在另一边做任何事情。远程主机将不知道连接已关闭。 检查连接是否关闭的唯一方法是尝试从/向输入/输出流读取或写入。如果-1方法返回InputStream#read(),则第二方知道第一方关闭了连接。抛出的IOException也表示已关闭连接。

通常,在调用Socket#close()时,您不需要关闭输入/输出流。 Socket#close()是您关闭连接所需要做的唯一事情。

但是如果你有一个包装器流(例如BufferdInputStream / BufferedOutputStream),你应该显式地关闭这些包装器流以释放这些包装器流使用的资源(例如字节缓冲器数组)。您只需要关闭顶级包装器流,因为关闭包装器会关闭包装的流,这也会关闭包装流的包装流。等等...

答案 1 :(得分:0)

Socket.close()是一种关闭连接的简洁方法。它会导致TCP FIN数据包发送到对等体,从而启动正常的TCP关闭序列。它还会关闭套接字的InputStream和OutputStream,我不会在文档中看到任何歧义。