Подтвердить что ты не робот

В чем разница между java.net.SocketException: Connection reset и java.net.SocketException: Broken Pipe?

В чем разница между java.net.SocketException: Connection reset и java.net.SocketException: Broken Pipe?

Я пытаюсь понять, в чем причины этих двух исключений. Мы получаем следующую ошибку на нашем сервере, которая в основном представляет собой веб-сервис на основе мыла. Когда я пытаюсь прервать вызов клиента, исключение, которое я вижу, это Broken pipe...

Ниже показана трассировка стека, любая помощь приветствуется!

2011-01-10 00:44:33,828 96893947 INFO  [STDOUT] (http-0.0.0.0-8180-Processor25:) ERROR:  ''
2011-01-10 00:44:33,829 96893948 INFO  [STDOUT] (http-0.0.0.0-8180-Processor25:) Jan 10, 2011 12:44:33 AM com.sun.xml.rpc.server.http.JAXRPCS
ervletDelegate doGetDefault
SEVERE: JAXRPCSERVLET34: transformation failed : ClientAbortException:  java.net.SocketException: Connection reset
JAXRPCSERVLET34: transformation failed : ClientAbortException:  java.net.SocketException: Connection reset
        at com.sun.xml.rpc.server.http.WSDLPublisher.handle(WSDLPublisher.java:109)
        at com.sun.xml.rpc.server.http.JAXRPCServletDelegate.doGetDefault(JAXRPCServletDelegate.java:185)
        at com.sun.xml.rpc.server.http.JAXRPCServletDelegate.doGet(JAXRPCServletDelegate.java:153)
        at com.sun.xml.rpc.server.http.JAXRPCServlet.doGet(JAXRPCServlet.java:111)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:697)
--
        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
        at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
        at java.lang.Thread.run(Thread.java:595)
2011-01-10 00:44:33,829 96893948 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/soa].[UserService]] (http-0.0.0.0-81
80-Processor25:) Servlet.service() for servlet UserService threw exception
javax.servlet.ServletException: JAXRPCSERVLET34: transformation failed : ClientAbortException:  java.net.SocketException: Connection reset
        at com.sun.xml.rpc.server.http.JAXRPCServletDelegate.doGetDefault(JAXRPCServletDelegate.java:347)
        at com.sun.xml.rpc.server.http.JAXRPCServletDelegate.doGet(JAXRPCServletDelegate.java:153)
        at com.sun.xml.rpc.server.http.JAXRPCServlet.doGet(JAXRPCServlet.java:111)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:697)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
4b9b3361

Ответ 1

Это условия ошибки на уровне протокола TCP. Оба они в основном означают, что другая сторона закрыла TCP-соединение. Разница заключается в том, на какой стадии общения происходит.

Ответ 2

"Соединение reset" может возникать при чтении или записи. "Сломанная трубка" может возникать только при записи. Оба они вызваны записью на соединение, которое уже было закрыто другим концом, или которое было reset по какой-либо другой причине.

Ответ 3

Оба Connection reset и Broken pipe возникают, когда соединение закрывается одноранговым узлом (то есть приложение, поддерживающее соединение с другой стороны).

Connection reset может возникать при записи (см. java.net.SocketOutputStream) или чтение (см. java.net.SocketInputStream).

Broken pipe встречается в собственном методе java.net.SocketException:

java.net.SocketException: Broken pipe
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)

Таким образом, Broken pipe происходит на более низком уровне коммуникации, как предположил Майкл Боргвардт.

В большинстве случаев я вижу эту ошибку при отправке большого PDF файла в клиентский браузер, и пользователь убивает браузер, прежде чем получить весь документ (в этом случае я просто игнорирую ошибку, поскольку это был выбор пользователя для закрытия браузера и нечего исправить). Но это могут быть и другие причины (например, EJP предлагает больше причин, связанных с протоколами передачи данных).

Ответ 4

Оба, похоже, указывают на аналогичный случай - удаленный сокет больше не доступен для записи.

Недавно с моим экспериментом я обнаружил, что Broken pipe возникает, когда моя служба находится в Unix env, и я завершаю клиент.

015-06-26 10:53:51,028-0400 [ERROR][WS-ASync] (Handler.java:1168) Exception while writing ClientAbortException:  java.net.SocketException: Broken pipe
ClientAbortException:  java.net.SocketException: Broken pipe
    at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:413)
    at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:371)
    at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:438)

В то время как при работе с серверами в окнах я вижу соединение reset exception

2015-06-26 09:11:31,491 ERROR [WS-ASync] (Handler.java:1168) - Exception while writing ClientAbortException:  java.net.SocketException: Connection reset by peer: socket write error
ClientAbortException:  java.net.SocketException: Connection reset by peer: socket write error
    at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:388)
    at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:462)
    at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:366)
    at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:413)
        at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:366)