【问题标题】:Java TCP Socket wait for idle?Java TCP Socket等待空闲?
【发布时间】:2015-10-16 19:40:31
【问题描述】:

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

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

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

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

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

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

谢谢!

【问题讨论】:

    标签: java sockets tcp mina


    【解决方案1】:

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

    没有字符串(可以这么说)连接 TCP 连接的两端,而只是关于连接状态的协议。结果是在超时之前,无法知道连接的另一端已经消失,除非连接的另一端发送其意图断开连接的通知。

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

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

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

    【讨论】:

    • 谢谢,特雷弗。我有一种感觉,这就是它的本来面目。这太糟糕了,但至少我现在明白为什么了。我必须调整空闲超时值才能找到最佳位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 2015-07-11
    • 2023-02-03
    • 1970-01-01
    • 2019-07-07
    相关资源
    最近更新 更多