Java套接字流意外结束

时间:2009-11-01 13:37:20

标签: java sockets stream

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

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

在目前的情况下,我可以选择将-1视为流的结尾并关闭套接字(具有误报),或忽略-1输入并且不会收到实际断开连接的通知。

我无法创建此问题的工作示例,问题会随机出现。

任何想法有什么不对?

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

4 个答案:

答案 0 :(得分:1)

如果你得到-1意味着流已关闭,那么你不能读取超出此数据并找到更多数据。流关闭后,无法再次读取。

听起来你正在执行read()并将其转换为一个字节。这意味着你无法区分255值(你可以读到的值)和-1流闭合值(你不能)(

答案 1 :(得分:0)

检查路由器。廉价路由器,特别是那些做NAT的路由器,常常会偶尔清理连接表,导致连接失效。

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

答案 2 :(得分:0)

你有没有用过Wireshark?它非常容易设置,如果发生这种情况,可能会让您知道TCP会话是否有任何异常。

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

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

答案 3 :(得分:-1)

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