Connection reset by peer – 客户端非正常中断连接
IOException: Connection reset by peer 的真正原因是什么?
Connection reset by peer 这种客户端的问题一般服务端没有很好的处理方案。
有可能是客户端处于弱网环境,或者客户端进程突然被 kill 掉了
Connection reset by peer 和 ClientAbortException: java.io.IOException: Broken pipe 这两个问题一般是伴生的。
public String save(HttpServletRequest request, HttpServletResponse response) {
String body = "";
try {
body = request.getReader().lines().collect(Collectors.joining(System.lineSeparator()));
// ....
} catch (IOException e) {
e.printStackTrace();
}
}
2022-06-18 06:18:23.902+0800 ERROR [demo-app,6949e64459034ab4,6949e64459034ab4] [http-nio-10666-exec-149] o.a.c.c.C.[.[.[/].[dispatcherServlet].log:175 Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.io.UncheckedIOException: org.apache.catalina.connector.ClientAbortException: java.io.IOException: Connection reset by peer] with root cause
java.io.IOException: Connection reset by peer
at java.base/sun.nio.ch.FileDispatcherImpl.read0(Native Method)
at java.base/sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39)
at java.base/sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:276)
at java.base/sun.nio.ch.IOUtil.read(IOUtil.java:245)
at java.base/sun.nio.ch.IOUtil.read(IOUtil.java:223)
at java.base/sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:358)
at org.apache.tomcat.util.net.NioChannel.read(NioChannel.java:160)
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1312)
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1226)
at org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:805)
at org.apache.coyote.http11.Http11InputBuffer.access$400(Http11InputBuffer.java:42)
at org.apache.coyote.http11.Http11InputBuffer$SocketInputBuffer.doRead(Http11InputBuffer.java:1185)
at org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:101)
at org.apache.coyote.http11.Http11InputBuffer.doRead(Http11InputBuffer.java:249)
at org.apache.coyote.Request.doRead(Request.java:640)
at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:316)
at org.apache.catalina.connector.InputBuffer.realReadChars(InputBuffer.java:383)
at org.apache.catalina.connector.InputBuffer.checkCharBufferEof(InputBuffer.java:609)
at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:434)
at org.apache.catalina.connector.CoyoteReader.read(CoyoteReader.java:108)
at org.apache.catalina.connector.CoyoteReader.readLine(CoyoteReader.java:163)
at java.base/java.io.BufferedReader$1.hasNext(BufferedReader.java:574)
at java.base/java.util.Iterator.forEachRemaining(Iterator.java:132)
at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipelin