Java套接字异常:recv失败

Bim*_*imp 5 java sockets exception recv

这基本上是图片:我有一个服务器和一个客户端(通过localhost操作).服务器为每个连接创建一个客户端线程.这个新线程在读取等待来自客户端的消息时阻塞.随意,我可以通过GUI停用服务器,GUI将(从主线程)"断开"发送到客户端,然后关闭输出流,唤醒被阻止的客户端线程,然后通过关闭套接字完成(我认为在关闭输出流之后这种关闭是不必要的,但无论如何).

客户端:连接请求后,它会休眠10秒,写入断开连接消息并通过char读取答案字符.

问题:

在该10秒客户端休眠时间内停用服务器后,客户端从服务器正确读取"断开连接"消息.但是,如果我只为每个char读取添加一个虚拟打印(在while循环内),则最终读取的结果会发生变化.有时它会正确读取服务器的"断开连接",有时会读取"disco"或类似的变体,并抛出此异常:

"Java异常:"软件导致连接中止:recv失败"

有关添加少量打印件的原因有何建议可以创建此结果?我会假设另一端有一个封闭的套接字对读取消息没有影响.我发现有关recv错误的其他线程提到超时,我猜测在使用localhost时应该不会发生这种情况?

Pet*_*rey 1

发生该错误是因为另一端已断开连接并且您的写入失败。如果您阅读得足够快,它还没有确定连接已丢失。

有多种方法可以避免此错误,但最简单的方法就是忽略它

  • 解决此问题的方法是请求与另一端断开连接,并且仅在收到断开连接响应时才关闭。此时,两端都知道连接将被关闭,并且写入的消息不会丢失。但是,在任何情况下,您还必须处理连接的非正常关闭。 (2认同)