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