【问题标题】:Broken pipe on TCP socket readTCP套接字读取上的管道损坏
【发布时间】:2014-05-23 17:12:25
【问题描述】:

我有一个 Java 应用程序,它打开一个 TCP 服务器套接字,然后从这个套接字读取和写入。我遇到了一个问题,服务器在 read 上收到带有消息“Broken pipe”的 IOException。我很清楚为什么会在写入时发生这种情况,但我无法弄清楚为什么会在读取时发生。作为参考,这是堆栈跟踪的顶部

Caused by: java.io.IOException: Broken pipe
at sun.nio.ch.FileDispatcher.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:21)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:198)
at sun.nio.ch.IOUtil.read(IOUtil.java:166)
at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:243)

我假设必须发生的事情是操作系统给出 EPIPE 错误,但我找不到会发生这种情况的代码。我查看了文本“Broken pipe”的 JDK 源代码(Java 和 C 源代码),但找不到实际生成此异常的代码。

最终我要回答的问题是为什么会发生这种情况,但我也会接受一个简单地解释这个错误是在哪里产生的答案。

【问题讨论】:

  • 堆栈跟踪或多或少地告诉你异常是在哪里产生的——一个实现FileDispatcher.read0()的本机方法。实际的“Broken pipe”文本可能来自调用 C 语言 strerror() 函数。

标签: java sockets exception tcp nio


【解决方案1】:

读取时发生的原因与写入时发生的原因相同。您写入了已被对等方关闭的连接。您在读取时得到了它,因为异常由于缓冲而被延迟。

【讨论】:

  • 有没有办法测试对等点是否已经存在以避免管道损坏?我也有同样的问题。我杀死了我的服务器,然后 TCP 客户端抛出了一个 IOException Broken Pipe,我无法重新打开我的连接。
猜你喜欢
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 2011-11-04
  • 2010-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多