2014-05-23 2 views
0

У меня есть приложение на 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», и я не могу найти фрагмент кода, который фактически генерирует это исключение.

В конечном итоге вопрос, на который я пытаюсь ответить, - это то, почему это происходит, но я также согласен с ответом, который просто объясняет, где эта ошибка даже генерируется.

+0

Трассировка стека говорит вам более или менее о том, где было создано исключение - собственный метод, реализующий 'FileDispatcher.read0()'. Фактический текст «Сломанная труба», вероятно, произошел от вызова функции C language [strerror()] (http://en.wikipedia.org/wiki/String.h#cite_ref-38). – Kenster

ответ

0

Это происходит при чтении по той же причине, что и при записи. Вы написали соединение, которое уже было закрыто сверстником. Вы получили его на чтение, потому что исключение было отложено из-за буферизации.

Смежные вопросы