java - 检测 TCP 丢失?

标签 java networking tcp disconnect

目前,我检测客户端是否崩溃的方法是监听通信时是否发生异常。我认为这是因为如果客户端崩溃,操作系统将关闭套接字。如果客户的互联网中断或者他们关闭了电脑,异常还会触发吗?如果不是,处理这种断开连接的最佳方法是什么?谢谢。

最佳答案

TCP 旨在无限期地维持连接,即使没有数据在任一方向上通过连接移动也是如此。这意味着如果客户端的网络或中间网络出现故障,连接不会关闭,您也不会看到异常 - 事实上,如果这样的网络出现故障,然后稍后恢复,甚至数小时后,TCP在此期间未使用的连接默认情况下仍然存在,并且可用于以后的进一步通信。如果客户端计算机崩溃或突然断电,您也不会遇到异常。如果客户端计算机正常关闭,您可能会遇到异常,因为其关闭过程可能包括关闭所有连接,具体取决于操作系统。

如果您想在断网一段时间或客户端崩溃时断开连接,通常最好的方法是设置 TCP keepalive。在Java中,可以通过调用Socket.setKeepalive(true)来启用TCP keepalive。这会导致您的套接字偶尔发送探测数据包以检查连接的另一端是否仍处于 Activity 状态。

请注意,TCP 保持 Activity 检查之间的默认间隔通常为两个小时,并且它通常是系统范围的属性。如果您希望间隔更短,则需要更改系统配置。

关于java - 检测 TCP 丢失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21973321/

相关文章:

networking - 让 Laravel Homestead 可以通过互联网访问

amazon-web-services - 公共(public) Route53 CNAME 记录到私有(private) API 网关

c# - 缓冲来自套接字的字符串流

java - AWS Java SDK 2 S3复制对象

java - 在java中获取输入抛出异常

java - 从 viewpager 适配器设置页面标题后,页面标题不会出现在 ViewPager 中

java - 如何使用 Java 将自定义数据写入 TCP 数据包头选项字段?

networking - 处理实时游戏中的网络丢包——TCP和UDP

r - 在rhive.env()上出现错误:无法连接到x.x.x.x上的Rserver

java - 如何使用 GSON 序列化和反序列化包含 HashMap 和 Pairs 的对象