【发布时间】:2017-01-23 19:53:04
【问题描述】:
我有一个使用 MINA 版本 2 的服务器设置。 我对套接字和 tcp 没有太多经验。
问题是如果我与我的服务器建立连接,然后拔下我的互联网并关闭连接,(服务器没有收到连接被关闭的通知)服务器将永远认为我的连接仍然处于活动状态并且有效。
服务器将继续向我的连接发送消息,并且即使我的计算机上没有绑定到本地端口的任何内容也不会抛出任何异常。
如何测试连接是否仍然存在?
我尝试在调试模式下运行 MINA 日志记录,并记录
IoSession.isConnected() IoSession.isActive IoSession.isClosing
它们总是返回真、真、假。此外,在调试模式下,没有说明连接丢失的有用信息。它只是记录了常规的“已发送消息”内容,就好像没有任何问题一样。
从使用 Flash actionscript 开始,我曾经历过 flash 会抛出错误,表明它在无效套接字上运行。这让我相信它说服务器上的套接字不再对连接有效。那么换句话说,如果 flash 可以检测到无效的套接字,那么 Java 服务器应该能够检测到它是否太正确了?
如果真的无法检测到死连接,我总是可以设置一个连接保持活动例程,其中客户端不断向服务器发送“我在这里”消息,服务器关闭没有连接的会话传入消息持续几秒钟。
编辑:在得知“套接字”是私有的并且从不通过网络共享后,我设法为我的问题找到了更好的结果,我找到了这个 SO 线程。
Java socket API: How to tell if a connection has been closed?
很遗憾
IOException 'Connection reset by peer' 当我写信时不会发生 MINA 中的 IoSession。
编辑:
在 Java 中是否有任何方法可以检测在发送数据包后何时未收到对 TCP 数据包的 ACK? ACK 超时?
编辑:
但显然,我的计算机应该向服务器发送 RST?根据这个答案。 https://stackoverflow.com/a/1434592/4425643 但这似乎是一种糟糕的端口扫描方式。这是端口扫描的工作原理吗?端口扫描器将数据发送到端口,而受害者的服务以 RST 响应?抱歉,我想我需要一个新问题来解决所有这些问题。但奇怪的是,MINA 在发送数据时不会引发对等方的连接重置。那么我的电脑没有发送 RST。
【问题讨论】:
-
人们似乎同意在这个线程中 TCP ACK 没有暴露给 Java。如果是这种情况,那么我想在 Java 中设置 ACK 超时是不可能的。stackoverflow.com/questions/2173153/…
-
服务器在尝试从客户端读取时应该遇到读取超时,或者
IOException: connection reset尝试写入客户端。假设您正在使用读取超时,或者非阻塞或异步等效项,并假设 Mina 没有屏蔽您的IOException,这是不应该做的。您无法控制 Java 中的 ACK 超时,也没有任何理由认为它们在您的系统中具有异常值。 -
"或任何理由认为它们在您的系统中有异常值" 等待 ack 的发送使连接保持活动状态超过 15 分钟。嗯,我想这很好。也许有一天我会发明无限连接,其中套接字在关闭时保存在客户端,然后在启动时恢复,以便可以重用 MINA 中的连接;)