【问题标题】:Java socket exception: recv failed [duplicate]Java套接字异常:recv失败[重复]
【发布时间】:2012-01-16 18:37:13
【问题描述】:

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

客户端: 连接请求后,休眠 10 秒,写入断开连接消息并逐字符读取应答。

问题:

在 10 秒客户端休眠时间内停用服务器后,客户端从服务器正确读取“断开连接”消息。但是,如果我只是为每个字符读取(在 while 循环内)添加一个虚拟打印,最终读取的结果会有所不同。 有时它会正确读取服务器的“断开连接”,有时它会读取“迪斯科”或类似的变体,并抛出此异常:

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

关于为什么添加一些打印会产生此结果的任何建议?我会假设在另一端有一个封闭的套接字不会影响阅读消息。 我发现的有关 recv 错误的其他线程提到了超时,我猜在使用 localhost 时不应该真的发生这种情况?

【问题讨论】:

  • 如果其他答案中提到的“超时”是指写入超时,那么确实可以认为它是重复的

标签: java sockets exception recv


【解决方案1】:

最近看到这个错误是由于 JBoss 配置中缺少代理集(即standalone.xml)引起的。如有必要,将代理添加到您的系统属性 - 您可以通过使用 SoapUI 调用 Web 服务来检查是否需要它们。

【讨论】:

  • 真的吗?使用相同的文本:“软件导致连接中止”?
  • 是的。不太清楚为什么有必要对我投反对票。
【解决方案2】:

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

有一些方法可以避免这个错误,但最简单的方法就是忽略它

【讨论】:

  • “我的写入失败”是指客户端的写入?
  • 是的。操作系统接受了写入,因为当时它不知道服务器已断开连接。服务器确定服务器断开连接后,它可以给你这个错误。您可以在确定之前或之后读取流的结尾。
  • 解决此问题的一种方法是请求与另一端断开连接,并且仅在收到断开连接响应时关闭。此时,两端都知道要关闭连接,写入的消息不会丢失。但是,无论如何,您还必须处理不正常的连接关闭。
  • 是的,这将是解决它的好方法,不幸的是我无法正常管理客户端(在示例中我只是管理它以找到可能出错的方法)。
  • 您可以让服务器发送断开连接,然后等待客户端接受请求,然后才关闭连接。 (或者如果仍然没有关闭它就超时并关闭它)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
  • 2013-11-02
  • 2016-07-09
  • 1970-01-01
  • 2012-09-10
相关资源
最近更新 更多