Connection reset by peer: socket write error错误分析及解决

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zangpuu/article/details/6618927
Connection reset by peer: socket write error错误分析:

常出现的Connection reset by peer: 原因可能是多方面的,不过更常见的原因是: 
①:服务器的并发连接数超过了其承载量,服务器会将其中一些连接Down掉; 
②:客户关掉了浏览器,而服务器还在给客户端发送数据; 
③:浏览器端按了Stop 

通常原因为:远程主机上对等方应用程序突然停止运行,或远程主机重新启动,或远程主机在远程方套接字上使用了“强制”关闭 (参见setsockopt(SO_LINGER))。另外,在一个或多个操作正在进行时,如果连接因“keep-alive”活动检测到一个失败而中 断,也可能导致此错误。此时,正在进行的操作以错误码WSAENETRESET失败返回,后续操作将失败返回错误码WSAECONNRESET。
但是如果频繁出现,就表示很 多客户端连接到Apache服务器的响应时间太长了,可能是网络的问题或者服务器性能问题。



网友分析:


楼主
   要从一个被屏蔽的网站上下载一些东西,于是写了一个Servlet,将它传到了一台境外的服务器上.
让这台服务器去下载指定的资源,然后再回传给我.相当于一个代理吧.

JAVA code
public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String url = request.getParameter("url"); //得到要下载的资源的URL.

        if (!StringUtils.isNullOrEmpty(url)) {
            System.out.println(url);
            URL u = new URL(url);
            URLConnection conn = u.openConnection();

            try { ///把响应头设置成一样的.
                for (Map.Entry<String, List<String>> m : conn.getHeaderFields()
                        .entrySet()) {
                    if (m != null && m.getKey() != null && m.getValue() != null
                            && m.getValue().size() > 0) {
                        response.setHeader(m.getKey(), m.getValue().get(0));
                    }
                }
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
                CommonLog.log.warn(e);
            }

            InputStream in = conn.getInputStream(); //从 connection得到inputstream
            OutputStream out = response.getOutputStream(); //得到向客户端的输出流
            try {
                IOUtils
                        .wrITe(conn.getInputStream(), response
                                .getOutputStream()); //写数据.
            } catch (Exception e) {
                e.printStackTrace();
                // TODO: handle exception
                CommonLog.log.warn(e);
                if (in != null) {
                    in.close();
                }
                if (out != null) {
                    out.close();
                }
            }
        }
    }


IOUtils.wrITe()代码如下:

JAVA code
    /**
     * 从input里面读取数据然后写入output,读完后自动关闭流。
     * @param input inputStream
     * @param output outputStream
     * */
    public static void write(InputStream input, OutputStream output)
            throws IOException {
        write(input,output,true);
    }

    /**
     * 自动从inputstream里面读数据,然后写到outputstream里面去。
     * @param input inputstream
     * @param output outputstream
     * @param close 读完后是否自动关闭流。
     * */
    public static void write(InputStream input, OutputStream output,boolean close)
            throws IOException {
        byte[] b = new byte[1024];
        int len = input.read(b);
        while (len != -1) {
            output.wrITe(b, 0, len);
            len = input.read(b);
        }
        
        output.flush();
        if (close) {
            input.close();    
            output.close();
        }
    }


将程序传到服务器上以后,在服务器上访问
http://localhost:8080/test/down?url=http://www.xxx.com/z.zip
可以下载成功.

但是当远程访问的时候,就会出现
JAVA.NET.SocketException:  Connection reset by peer: socket wrITe error

假设服务器IP是2.2.2.2吧.

访问
http://2.2.2.2:8080/test/down?url=http://www.xxx.com/z.zip
就会出现上面的那个错误.
注意,我并没有关闭浏览器或者按停止按钮.只要一打上那个地址就会出错.


错误发生在:

JAVA code
output.wrITe(b, 0, len);//执行这行代码的时候.


具体的错误信息如下:


JAVA code
ClientAbortException:  java.net.SocketException: Connection reset by peer: socket write error
    at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:366)
    at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:432)
    at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:347)
    at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:392)
    at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:381)
    at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:89)
    at com.joejoe.utils.IOUtils.write(IOUtils.java:62)
    at com.joejoe.utils.IOUtils.wrITe(IOUtils.java:48)
    at com.tqsoft.wdys.other.getMegavideo.doGet(getMegavideo.java:79)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:627)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    at com.joejoe.utils.WEB.CharSetFilter.doFilter(CharSetFilter.java:39)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:875)
    at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BASEProtocol.java:665)
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.net.SocketException: Connection reset by peer: socket write error
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrITe(Unknown Source)
    at JAVA.NET.SocketOutputStream.write(Unknown Source)
    at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:750)
    at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:432)
    at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:347)
    at org.apache.coyote.http11.InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:773)
    at org.apache.coyote.http11.filters.IdentityOutputFilter.doWrite(IdentityOutputFilter.java:118)
    at org.apache.coyote.http11.InternalOutputBuffer.doWrite(InternalOutputBuffer.java:583)
    at org.apache.coyote.Response.doWrite(Response.java:560)
    at org.apache.catalina.connector.OutputBuffer.realWrITeBytes(OutputBuffer.JAVA:361)
    ... 27 more


请问如何解决.谢谢.
.
[华 软 网]
编 程论坛 1 个网友回答:   嘿嘿,陪你一起期待解决方案啦            .
[华 软 网]
编 程论坛 2 个网友回答:   顶起            .
[华 软 网]
编 程论坛 3 个网友回答:   帮忙。            .
[华 软 网]
编 程论坛 4 个网友回答:   我google过 原因我忘了 不过解决方法是用try catch包起来 对这异常不做处理
这样做确实没什么影响 不过是为什么  我也不是很清楚!            .
[华 软 网]
编 程论坛 5 个网友回答:   说是这原因 
存在的连接被远程主机强制关闭。通常原因为:远程主机上对等方应用程序突然停止运行,或远程主机重新启动,或远程主机在远程方套接字上使用了“强制”关闭 (参见setsockopt(SO_LINGER))。另外,在一个或多个操作正在进行时,如果连接因“keep-alive”活动检测到一个失败而中 断,也可能导致此错误。此时,正在进行的操作以错误码WSAENETRESET失败返回,后续操作将失败返回错误码WSAECONNRESET。              .
[华 软 网]
编 程论坛 6 个网友回答:   ClientAbortException: JAVA.NET.SocketException:  Connection reset by peer: socket wrITe  error的原因是由于处理http连接时,正在输出内容时,用户关闭了IE,会出现一个"ClientAbortException",属于I/O处理 中出现的一个异常,应用服务器应该会捕捉。
Connection reset by peer的原因:
经常出现的Connection reset by peer: 原因可能是多方面的,不过更常见的原因是:
①:服务器的并发连接数超过了其承载量,服务器会将其中一些连接Down掉;
②:客户关掉了浏览器,而服务器还在给客户端发送数据;
③:浏览器端按了Stop
很多人都说是客户端造成的,没有办法控制,是个比较郁闷的问题。            .
[华 软 网]
编 程论坛 7 个网友回答:  
引用 6 楼 phoenixLotus 的回复:
ClientAbortException: JAVA.NET.SocketException:  Connection reset by peer: socket wrITe  error的原因是由于处理http连接时,正在输出内容时,用户关闭了IE,会出现一个"ClientAbortException",属于I/O处理 中出现的一个异常,应用服务器应该会捕捉。 
Connection reset by peer的原因: 
经常出现的Connection reset by peer: 原因可能是多方面的,不过更常见的原因是: 
①:服务器的并发连接数超过了其承载量,服务器会…


都不是这些原因,就我一个人访问那服务器,我没有关IE,也没有按STOP。            .
[华 软 网]
编 程论坛 8 个网友回答:   试下这个了 不行我也没办法了:
引起该问题的原因是由于此时Server端连接已经被复位,而Client依然通过该连接在接收和发送数据,在网上搜索了一下 该错误,发现该错误引起的原因大都是防火墙的原因。            .
[华 软 网]
编 程论坛 9 个网友回答:   一般是有些客户端已关闭,一些线程因为延迟等原因觉察不到此连接已结束,继续等到到出错

或是

客户端那里不停刷或一个访问/刷新没完成前再刷,要让这个无用的线程死掉


看就你一个人访问的话,就是第一种了            .
[华 软 网]
编 程论坛 10 个网友回答:   查询了一下网上有人说
这个问题一般是客户端在连接还没有完全建立的时候就取消连接,比如用户按了浏览器上面的“停止”按钮,一般来说没有什么问题。但是如果频繁出现,就表示很 多客户端连接到Apache服务器的响应时间太长了,可能是网络的问题或者服务器性能问题。            .
[华 软 网]
编 程论坛 11 个网友回答:   留个脚印。关注!            .
[华 软 网]
编 程论坛 12 个网友回答:   我想应该不是连接中断的问题吧。
我根本就没有不停地去刷新或者按停止按钮之类的。
而且在我的机子上,无论访问多少次,都是错的。/

在服务器上访问无论多少次都是正确的。
刚有一英国的朋友也访问了一下,他那里也没有错。。            .
[华 软 网]
编 程论坛 13 个网友回答:   一起关注吧            .
[华 软 网]
编 程论坛 14 个网友回答:  
引用 5 楼 phoenixLotus 的回复:
说是这原因 
存在的连接被远程主机强制关闭。通常原因为:远程主机上对等方应用程序突然停止运行,或远程主机重新启动,或远程主机在远程方套接字上使用了“强制”关闭 (参见setsockopt(SO_LINGER))。另外,在一个或多个操作正在进行时,如果连接因“keep-alive”活动检测到一个失败而中 断,也可能导致此错误。此时,正在进行的操作以错误码WSAENETRESET失败返回,后续操作将失败返回错误码WSAECONNRESET。  

有可能,看了下,觉得不是程序的问题,可能是网络连接出现的问题

还有个情况说下,楼主这段程序的异常处理太简单了啊            .
[华 软 网]
编 程论坛 15 个网友回答:   试下这个了 不行我也没办法了: 
引起该问题的原因是由于此时Server端连接已经被复位,而Client依然通过该连接在接收和发送数据,在网上搜索了一下 该错误,发现该错误引起的原因大都是防火墙的原因。
展开阅读全文

没有更多推荐了,返回首页