我不确定这是一个Java问题还是TCP问题,或两者兼而有之:
我有一些使用Apache Mina的服务器代码,它运行服务器在给定套接字上侦听TCP。我已经扩展了IoHandlerAdapter的处理程序。我正在使用它通过HTTP / 1.1
将摄像头连接到Java服务器问题是:如果我建立连接然后完全断开相机(拉电源或拉网络),我必须等到调用sessionIdle方法来检测会话现在已经死亡(然后明确关闭)来自服务器端的会话)。
我的问题是:有没有办法知道TCP会话是否被客户端立即破坏?或者这只是TCP会话/ Mina的工作方式?
理想情况下,sessionIdle仅适用于TCP套接字尚未死亡但客户端(摄像头)已停止通过套接字进行通信的情况......并且其他一些机制会在套接字实际被杀死时被捕获(由客户端/网络)。
注意:我正在覆盖exceptionCaught()但我没有看到在我拔掉电源或网络的情况下被调用。它只是坐到空闲时间然后调用sessionIdle()。
谢谢!
答案 0 :(得分:2)
不幸的是,由于删除的一端没有机会通知连接的另一端,因此无法立即检测到连接一端的突然删除。
没有连接TCP连接两端的字符串(可以这么说),而是只有连接状态的协议。结果是,在达到超时之前,无法知道连接的另一端已经消失,除非连接的那一端发送了断开连接意图的通知。
作为类比,假设您正在与另一个房间里的某个人进行对话,而这个房间是您无法看到的。你什么时候认为它们不再存在?如果他们告诉你他们要离开,然后你听到门关上了,那么假设他们已经离开是合理的。但是,如果他们只是没有回答你的问题,你可能会重复这个问题,这次可能会有点大声。然后你可能会稍等一下,打电话给他们的名字,也许再等一会儿回复,然后最后走到另一个房间看他们是否还在那里。
这是TCP基本上做的事情(特别是如果你发送保持活动),除了它无法走到另一个房间并且只能依靠超时阈值被击中以指示对方已经离开。因此,如果在没有来自另一方的响应的情况下达到超时,则会假设他们已经离开而没有告诉您。
这就是为什么当你的连接的另一边突然消失时你必须依靠超时来告诉你,因为根本没有别的方法可以知道。