【发布时间】: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