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_Stream - Fatal编程技术网

Java套接字流意外结束

Java套接字流意外结束,java,sockets,stream,Java,Sockets,Stream,我有一个应用程序,处理到不同类型远程机器(一些PC,其他是嵌入式设备)的几个Java套接字连接。这些套接字和流不应无限期关闭,除非有很好的原因(例如远程系统崩溃) 我经常遇到输入流意外结束的问题,没有任何原因(值为-1),即远程机器没有发出连接中止的信号。但是当我放弃这些-1读取并继续从流中读取时,远程机器实际上会在以后发送新数据。这可能会持续很长时间。我还可以写入输出流 在当前情况下,我可以选择将-1视为流的结尾并关闭套接字(带有误报),或者忽略-1输入并冒没有收到真正断开连接通知的风险 我还

我有一个应用程序,处理到不同类型远程机器(一些PC,其他是嵌入式设备)的几个Java套接字连接。这些套接字和流不应无限期关闭,除非有很好的原因(例如远程系统崩溃)

我经常遇到输入流意外结束的问题,没有任何原因(值为-1),即远程机器没有发出连接中止的信号。但是当我放弃这些-1读取并继续从流中读取时,远程机器实际上会在以后发送新数据。这可能会持续很长时间。我还可以写入输出流

在当前情况下,我可以选择将-1视为流的结尾并关闭套接字(带有误报),或者忽略-1输入并冒没有收到真正断开连接通知的风险

我还没有能够创建一个这个问题的工作示例,并且问题随机出现

你知道怎么了吗


编辑以添加:Java端点是对没有这些问题的现有VB应用程序的重写(至少据我所知)。

检查ewteen中的路由器。便宜的路由器,尤其是那些使用NAT的路由器,经常会偶尔清理连接表,导致连接失效


在任何情况下,您的应用程序都应该能够抵御这些情况(它们会再次发生),您可以通过定期通过网络发送没有业务价值的数据包来帮助它。

检查网络中的路由器。便宜的路由器,尤其是那些使用NAT的路由器,经常会偶尔清理连接表,导致连接失效


在任何情况下,您的应用程序都应该能够抵御这些情况(它们会再次发生),您可以通过定期通过网络发送没有业务价值的数据包来帮助它。

您的环境中显然存在一些网络问题,您可以尝试跟踪它们,但是暂时关闭流并重新打开它更安全。这就是API所假定的。

您的环境中显然存在一些网络问题,您可以尝试跟踪它们,但暂时关闭流并重新打开它更安全。这就是API的假设。

您是否使用过Wireshark?它非常容易设置,并且在发生这种情况时,可能会让您知道TCP对话是否有任何异常

我曾经遇到过类似于您的问题,我通过在服务器和客户端之间每分钟发送一条ping消息来解决它。(后来发现,如果10分钟内没有流量通过,防火墙问题有时会关闭一半连接。)


我知道您正在发送KeepAlive消息,但可能是因为沿途有一些东西不支持它们。如果您发送自己的带有几个字节的ping消息,您可以确定。无论哪种情况,我都会使用Wireshark捕获两端的实际数据包,以确保KeepAlive消息真正到达端点。

您使用过Wireshark吗?它非常容易设置,并且在发生这种情况时,可能会让您知道TCP对话是否有任何异常

我曾经遇到过类似于您的问题,我通过在服务器和客户端之间每分钟发送一条ping消息来解决它。(后来发现,如果10分钟内没有流量通过,防火墙问题有时会关闭一半连接。)


我知道您正在发送KeepAlive消息,但可能是因为沿途有一些东西不支持它们。如果您发送自己的带有几个字节的ping消息,您可以确定。在这两种情况下,我都会使用Wireshark捕获两端的实际数据包,以确保KeepAlive消息真正到达端点。

如果得到-1表示流已关闭,则无法读取超出此范围的数据并找到更多数据。流一旦关闭,就无法再次读取


听起来像是在执行read()并将其转换为一个字节。这意味着您无法区分255值(可以读取超过255)和-1流关闭值(无法读取)之间的差异。

如果得到-1表示流已关闭,则无法读取超过255的值并查找更多数据。流一旦关闭,就无法再次读取


听起来像是在执行read()并将其转换为一个字节。这意味着您无法区分255值(您可以读取更多)和-1流关闭值(您无法)之间的差异。定义并使用了“保持活动”消息,但没有帮助。当我在同一台机器上运行服务器和客户端时,这个问题也出现过一次。而且,正如我所说的,如果我忽略-1,它至少会在几个小时内发挥作用。我确实这样做了。定义并使用了“保持活动”消息,但没有帮助。当我在同一台机器上运行服务器和客户端时,这个问题也出现过一次。另外,正如我所说,如果我忽略-1,它至少会在几个小时内像一个符咒一样工作。我认为查看您的源代码会有所帮助。谢谢,但正如我所说,我还没有创建一个简单、有效的问题示例,整个问题的代码太多了。“太多的代码”可能是你的问题的一部分。它不应该这么复杂。我想看一下你的源代码会有所帮助。谢谢,但正如我所说,我还没有创建一个简单的、有效的问题示例,整个问题就是太多的代码。“太多的代码。”“,可能是您的问题的一部分。它不应该这么复杂。我不是在发送tcp keepalive,而是Thorbjørn建议的实际“空”业务消息,以确保至少每十分钟发送一条消息。减少是困难的,因为整个过程还需要在相当昂贵的3G移动网络上工作,所以我还需要保持低字节数