java套接字流意外结束

r55awzrz  于 2021-07-05  发布在  Java
关注(0)|答案(4)|浏览(235)

我有一个应用程序处理几个java套接字连接到不同类型的远程机器(有些pc,有些是嵌入式设备)。这些套接字和流不应无限期关闭,除非有很好的原因(例如远程系统崩溃)。
我经常遇到输入流意外结束的问题,没有任何原因(值为-1),即远程机器没有发出连接中止的信号。但是当我放弃这些-1读取并继续从流中读取时,远程机器实际上会稍后发送新数据。这种情况会持续很长时间。我还可以写入输出流。
在当前情况下,我可以选择是将-1视为流的结尾并关闭套接字(带有误报),还是忽略-1输入并冒没有收到真正断开连接通知的风险。
我还没能创建一个这个问题的工作示例,问题随机出现。
有什么问题吗?
编辑添加:java端点是对现有vb应用程序的重写,该应用程序没有这些问题(至少据我所知)。

lo8azlld

lo8azlld1#

检查中间的路由器。对于便宜的路由器来说,尤其是那些使用nat的路由器,经常会清理连接表,导致连接失效。
在任何情况下,您的应用程序都应该对这些事情具有健壮性(它们还会再次发生),您可以通过定期地通过网络发送没有业务价值的数据包来帮助它。

mbzjlibv

mbzjlibv2#

你用过wireshark吗?设置起来非常简单,如果发生这种情况,可能会让您知道tcp会话是否有异常。
我有一次遇到类似的问题,我通过在服务器和客户端之间每分钟发送一条ping消息来解决它(后来发现,如果10分钟内没有流量通过,防火墙问题有时会关闭一半连接。)
我知道您正在执行keepalive消息,但可能是沿途的某些内容不支持它们。如果您发送自己的带有几个字节的ping消息,您可以确定。在任何一种情况下,我都会用wireshark捕获两端的实际数据包,以确保keepalive消息真正到达端点。

ttygqcqt

ttygqcqt3#

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

epggiuax

epggiuax4#

如果得到-1表示流已关闭,则无法读取超出此范围的内容并查找更多数据。流一旦关闭,就不能再读取。
听起来像是在执行read()并将其转换为一个字节。这意味着您无法区分255值(您可以读取更多)和-1流关闭值(您不能)之间的差异

相关问题