У меня есть приложение на Java, которое открывает сокет TCP-сервера, а затем читает и записывает из этого сокета. Я столкнулся с проблемой, когда сервер получает сообщение IOException с сообщением «Broken pipe» на , читаемом. Я хорошо понимаю, почему это происходит при написании, но я не могу понять, почему это произойдет при чтении. Для справки, это верхняя часть стека трассировкиСломанная трубка на соке TCP прочитана
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, но я не могу найти код, где это будет происходить. Я просмотрел исходный код JDK (источник Java и C) для текста «Broken pipe», и я не могу найти фрагмент кода, который фактически генерирует это исключение.
В конечном итоге вопрос, на который я пытаюсь ответить, - это то, почему это происходит, но я также согласен с ответом, который просто объясняет, где эта ошибка даже генерируется.
Трассировка стека говорит вам более или менее о том, где было создано исключение - собственный метод, реализующий 'FileDispatcher.read0()'. Фактический текст «Сломанная труба», вероятно, произошел от вызова функции C language [strerror()] (http://en.wikipedia.org/wiki/String.h#cite_ref-38). – Kenster