繁体   English   中英

Java TCP Socket等待空闲吗?

[英]Java TCP Socket wait for idle?

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

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

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

我的问题是:难道没有办法知道客户端立即中断了TCP会话吗? 还是这只是TCP会话/ Mina的工作方式?

理想情况下,sessionIdle仅适用于TCP套接字尚未终止但客户端(摄像机)已停止通过套接字进行通信的情况……并且当套接字被客户端(或网络)杀死时,某些其他机制会捕获。

注意:我覆盖了exceptionCaught(),但是在拔掉电源或网络的情况下却看不到该调用。 它一直坐着直到空闲时间再调用sessionIdle()。

谢谢!

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

TCP连接的两端没有连接字符串(可以这么说),而是仅在连接状态上有协议。 结果是,除非达到超时,否则无法知道连接的另一端已经消失,除非该连接的另一端发送了有关断开连接的意图的通知。

打个比方,假设您正在与另一个房间的某人进行对话,而您却看不见。 您何时认为它们不再存在? 如果他们告诉您他们要离开,然后您听到门猛然关上,则可以合理地假设他们已经离开。 但是,如果他们只是不能回答问题,您可能会重复该问题,这次可能会更大声。 然后,您可以稍等片刻,给他们打电话,或者再等一会儿,然后最后走到另一个房间,看看他们是否还在。

TCP基本上就是这样做的(特别是如果您要发送保持活动),除了它没有办法走到另一房间并且只能依靠超时阈值来表明另一方已经离开之外。 因此,如果在对方没有响应的情况下发生超时,则假定他们离开了而没有告诉您。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM