正如标题所说 - 如果我想关闭套接字连接就足够了,如果我只是打电话给mySocket.close()
?另一方会发生什么?
或者,如果它不是要走的路,那是什么?我是否必须通过套接字发送某种“完成”消息,以便另一方知道它也应该结束?
奖金问题:java文档说
关闭此套接字也将关闭套接字的InputStream和OutputStream。
那么单独关闭套接字还是我必须明确关闭流(假设我当然没有使用try-with-resources
)?
答案 0 :(得分:3)
关闭套接字不会在另一边做任何事情。远程主机将不知道连接已关闭。
检查连接是否关闭的唯一方法是尝试从/向输入/输出流读取或写入。如果-1
方法返回InputStream#read()
,则第二方知道第一方关闭了连接。抛出的IOException
也表示已关闭连接。
通常,在调用Socket#close()
时,您不需要关闭输入/输出流。 Socket#close()
是您关闭连接所需要做的唯一事情。
但是如果你有一个包装器流(例如BufferdInputStream
/ BufferedOutputStream
),你应该显式地关闭这些包装器流以释放这些包装器流使用的资源(例如字节缓冲器数组)。您只需要关闭顶级包装器流,因为关闭包装器会关闭包装的流,这也会关闭包装流的包装流。等等...
答案 1 :(得分:0)
Socket.close()是一种关闭连接的简洁方法。它会导致TCP FIN数据包发送到对等体,从而启动正常的TCP关闭序列。它还会关闭套接字的InputStream和OutputStream,我不会在文档中看到任何歧义。