是否可以在客户端和服务器端关闭Java套接字?

Sha*_*yan 7 java sockets tcp

我在两个java应用程序之间有一个socket tcp连接.当一侧关闭插座时,另一侧保持打开状态.但我希望它能够关闭.而且我也迫不及待地想看看它是否可用,然后关闭它.我想从某一方面完全关闭它.我能做什么?

Nik*_*sov 10

TCP不能像这样工作.操作系统不会释放资源,即文件描述符,从而释放端口,直到应用程序显式关闭套接字或死亡,即使TCP堆栈知道另一方关闭它.在从对等方接收FIN时,没有从内核到用户应用程序的回调.操作系统向另一方确认它,但close()在发送其FIN数据包之前等待应用程序调用.看看TCP状态转换图 - 您处于被动关闭框中.

在没有为每个套接字专用线程的情况下检测这种情况的一种方法是使用select/poll/epoll/kqueue函数族.被动关闭的插座将作为可读信号发出信号,并且读取尝试将返回EOF.

希望这可以帮助.


nos*_*nos 6

双方都必须从连接中读取,以便他们可以检测到对等体何时关闭.当读取返回-1时,这意味着另一端关闭了连接,这是你结束结束的线索.

  • 然后,您将不得不切换到NIO并执行多路复用IO.如果要检测来自对等体的优雅关闭,则必须以某种方式从套接字读取. (3认同)