Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java套接字检测数据丢失?_Java_Sockets - Fatal编程技术网

如何使用Java套接字检测数据丢失?

如何使用Java套接字检测数据丢失?,java,sockets,Java,Sockets,我有以下情况:使用“经典”Java服务器(使用ServerSocket),我希望在与客户端的连接意外失败时(即非正常/没有FIN数据包)检测(尽可能快) 我模拟的方式如下: 我正在Linux机器上运行服务器 我用telnet连接到盒子 连接成功后,我在盒子的防火墙中添加“删除”规则 发生的情况是,发送阻塞了约10k的数据。我不知道等了多久,但我已经等了好几次超过10分钟了。到目前为止我所研究的: Socket.setSoTimeout-但这只影响读取。如果只有写入,则不会产生效果 使用Pr

我有以下情况:使用“经典”Java服务器(使用ServerSocket),我希望在与客户端的连接意外失败时(即非正常/没有FIN数据包)检测(尽可能快)

我模拟的方式如下:

  • 我正在Linux机器上运行服务器
  • 我用telnet连接到盒子
  • 连接成功后,我在盒子的防火墙中添加“删除”规则
发生的情况是,发送阻塞了约10k的数据。我不知道等了多久,但我已经等了好几次超过10分钟了。到目前为止我所研究的:

  • Socket.setSoTimeout-但这只影响读取。如果只有写入,则不会产生效果
  • 使用PrintWriter.checkError()检查错误,因为PW会接受异常,但它永远不会返回true
如何检测此错误情况,或至少配置超时值?(在JVM或操作系统级别)


更新:大约20分钟后,PrintWriter上的checkError返回true(在CentOS机器上使用服务器JVM 1.5)。此超时值在何处配置?

唯一可靠的方法是生成应用程序级别的“检查”,而不是依赖于传输级别。例如,一条双向心跳消息,如果任何一端都没有收到预期的消息,它将关闭并重置连接。

唯一可靠的方法是生成应用程序级别的“检查”,而不是依赖传输级别。例如,一条双向心跳消息,如果任何一端都没有收到预期的消息,它将关闭并重置连接。

约20分钟的超时是因为Linux中的标准TCP设置。除非你知道自己在做什么,否则和他们捣乱真的不是个好主意。我在工作中有一个类似的项目,我们通过断开网络电缆来测试连接丢失,结果会像你看到的那样挂起很长时间。我们尝试过干扰以下TCP设置,这使得超时更快,但在其他应用程序中会产生副作用,在这些应用程序中,当事情变得繁忙时,由于较小的网络延迟,连接在不应该中断的情况下会断开

net.ipv4.tcp_retries2
net.ipv4.tcp_syn_retries
如果您查看tcp手册页(man tcp),您可以了解这些设置的含义,并可能找到其他可能适用的设置。您可以直接在/proc/sys/net/ipv4下设置它们,也可以使用sysctl.conf。这两个是我们发现的使发送/接收失败更快的原因。尝试将它们都设置为1,您将看到发送调用失败的速度大大加快。在更改当前设置之前,请确保不使用这些设置

我要重申,你真的不应该弄乱这些设置。它们可能会对操作系统和其他应用程序产生副作用。最好的解决方案如Kitson所说,使用心跳和/或应用程序级超时


还要研究如何创建非阻塞套接字,以便发送调用不会像那样阻塞。尽管要记住,只要发送缓冲区中有空间,使用非阻塞套接字发送通常是成功的。这就是为什么在阻塞之前需要大约10k的数据,即使在此之前断开了连接。

约20分钟的超时是因为Linux中的标准TCP设置。除非你知道自己在做什么,否则和他们捣乱真的不是个好主意。我在工作中有一个类似的项目,我们通过断开网络电缆来测试连接丢失,结果会像你看到的那样挂起很长时间。我们尝试过干扰以下TCP设置,这使得超时更快,但在其他应用程序中会产生副作用,在这些应用程序中,当事情变得繁忙时,由于较小的网络延迟,连接在不应该中断的情况下会断开

net.ipv4.tcp_retries2
net.ipv4.tcp_syn_retries
如果您查看tcp手册页(man tcp),您可以了解这些设置的含义,并可能找到其他可能适用的设置。您可以直接在/proc/sys/net/ipv4下设置它们,也可以使用sysctl.conf。这两个是我们发现的使发送/接收失败更快的原因。尝试将它们都设置为1,您将看到发送调用失败的速度大大加快。在更改当前设置之前,请确保不使用这些设置

我要重申,你真的不应该弄乱这些设置。它们可能会对操作系统和其他应用程序产生副作用。最好的解决方案如Kitson所说,使用心跳和/或应用程序级超时

还要研究如何创建非阻塞套接字,以便发送调用不会像那样阻塞。尽管要记住,只要发送缓冲区中有空间,使用非阻塞套接字发送通常是成功的。这就是为什么在阻塞之前需要大约10k的数据,即使在此之前您断开了连接