java - apache mina 中的死 session

标签 java network-programming apache-mina

我们有一个基于 apache mina 的 GPRS 网关(服务器)。有时,通常当连接从客户端粗暴地终止时,即拔下电源线或任何其他异常关闭或网络出现问题时,它不会在服务器端被删除或关闭。它保持在那里,处于空闲状态,因为我不知道多长时间(可能永远)。 有时我们在关闭服务器时会遇到问题,MINA 会花费太多时间,有时我们最终不得不将其终止。我们怀疑此问题与死连接问题有关。
其实,这个死连接是有道理的。由于连接被粗暴地关闭并且 mina 没有办法检查它(这就是 tcp session 的工作方式)。 作为一种解决方法,我们设计了一个解决方案,如果它保持空闲(读取和写入)30 分钟(或任何可配置的时间),我们将关闭 session 。我们不喜欢它有两个原因:
1-它看起来不太好。
2-另外,我们有一个规则,即客户端与服务器建立持久连接。因此,设置“空闲超时”有点困难,因为我们不能关闭任何已空闲 x 分钟/小时的 session ,因为它可能是有效连接。

那么,在 MINA 中有没有更好更安全的方法来检测和清理这些死连接?

最佳答案

在这两种情况下,长时间不活动连接和丢失连接 - 在 channel 中没有 Activity 应该会导致在 OSI model 的每一层配置时间后超时。 . 例如。你的防火墙/路由器/服务器可能会在 10 分钟内超时非 Activity 连接条目,那么你的应用程序层连接也应该在 10 分钟后这样做 - 等待更多没有意义。

为了防止静默连接超时,应该引入保活协议(protocol)。 它可能是 ping(不完全是 ICMP)或其他形式的周期性无操作通信。 当对等点处于 Activity 状态时,它应该响应并因此刷新所有网络层上的超时倒计时。在因超时或层信号断开连接导致尝试失败后,您可以假设您的应用层连接也断开了。

关于java - apache mina 中的死 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7510416/

相关文章:

java - JList如何以简单的方式删除一个项目?

Android:在应用程序中连接时,应用程序无法在 wifi 网络上 ping 设备

sockets - 关于so​​cket编程中getaddrinfo()函数的问题

java - 处理 Buffer 内多条消息的异常 [JAVA-Mina]

java - 定位 .jar 文件中的内部目录 -- java

java - JFreeChart 的堆叠折线渲染器?

java - Android中的异步通信

java - 是否有使用 Mina 2.x 的 modbus 实现?

Java递归输出

java - MulticastSocket.joinGroup() 错误