Java TCP 套接字等待空闲?

Java TCP Socket wait for idle?

我不确定这是 Java 问题还是 TCP 问题或两者兼而有之:

我有一些使用 Apache Mina 的服务器代码,它运行一个在给定套接字上侦听 TCP 的服务器。我的处理程序扩展了 IoHandlerAdapter。我正在使用它通过 HTTP/1.1

将相机连接到 Java 服务器

问题是:如果我建立连接然后完全断开相机(拉电源或拉网络),我必须等到调用sessionIdle方法来检测会话现在已经死了(然后从服务器端明确关闭会话)。

我的问题是:有没有办法知道TCP会话被客户端瞬间中断了?或者这只是 TCP 会话/Mina 的工作方式?

理想情况下,sessionIdle 仅适用于 TCP 套接字尚未终止但客户端(相机)已停止通过套接字通话的情况......当套接字实际被终止时(通过client/network).

注意:我正在重写 exceptionCaught() 但我没有看到在我拔掉电源或网络的情况下被调用。它只是坐到空闲时间然后调用 sessionIdle()。

谢谢!

遗憾的是,无法立即检测到连接一端的突然移除,因为被移除的一端没有机会通知连接的另一端。

没有字符串(可以这么说)连接 TCP 连接的两端,而只是连接状态的约定。结果是,在超时之前,没有办法知道连接的另一端已经消失,除非连接的那一端发送其打算断开连接的通知。

打个比方,假设您正在另一个房间里与您看不见的人进行对话。你什么时候认为他们不再存在?如果他们告诉你他们要走了,然后你听到关门声,就可以合理地假设他们已经离开了。但是,如果他们只是没有回答一个问题,您可能会重复这个问题,这次可能会大声一点。然后你可能会等一会儿,叫他们的名字,也许再等一会儿得到回应,然后也许最后走到另一个房间看看他们是否还在。

这就是 TCP 基本上所做的(特别是如果您发送保持活动状态),除了它无法走到另一个房间并且只能依靠达到超时阈值来指示对方已经离开.因此,当超时而另一方没有响应时,假设他们已经离开而没有告诉你。

这就是为什么当连接的另一端突然消失时,您必须依靠超时来通知您,因为没有其他方法可以知道。