Python socket.error: [Errno 104] Connection reset by peer

最近遇到Python 10个用户同时上传文件 报错的问题:

似乎客户端已连接到服务器,但是当他们尝试发送数据时遇到了异常。Python 第一次引发“[Errno 104] Connection reset by peer” 异常,然后第二次和更多次,您将在客户端收到“[Errno 32] Broken pipe”异常。

python客户端能看到报错,服务端无错误信息输出。服务端一直表示是客户端的问题

 查到的解决方案都是 捕获异常,等待一会。有没有其他解决方案?????

    try:
        r = requests.get(url).content
    except Exception, e:
        print str(e)
        time.sleep(1)

 

 

1,如果一端的Socket被关闭(或主动关闭,或因为异常退出而 引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。

Socket默认连接60秒,60秒之内没有进行心跳交互,即读写数据,就会自动关闭连接。

2,一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connection reset)。

简单的说就是在连接断开后的读和写操作引起的。

Connection reset by peer的常见原因:

1)服务器的并发连接数超过了其承载量,服务器会将其中一些连接关闭;(可参考提高服务器并发tcp连接数)

如果知道实际连接服务器的并发客户数没有超过服务器的承载量,则有可能是中了病毒或者木马,引起网络流量异常。可以使用netstat -an查看网络连接情况。

2)客户关掉了浏览器,而服务器还在给客户端发送数据;

3)浏览器端按了Stop;

这两种情况一般不会影响服务器。但是如果对异常信息没有特别处理,有可能在服务器的日志文件中,重复出现该异常,造成服务器日志文件过大,影响服务器的运行。可以对引起异常的部分,使用try…catch捕获该异常,然后不输出或者只输出一句提示信息,避免使用e.printStackTrace();输出全部异常信息。

4)防火墙的问题;

如果网络连接通过防火墙,而防火墙一般都会有超时的机制,在网络连接长时间不传输数据时,会关闭这个TCP的会话,关闭后在读写,就会导致异常。 如果关闭防火墙,解决了问题,需要重新配置防火墙,或者自己编写程序实现TCP的长连接。实现TCP的长连接,需要自己定义心跳协议,每隔一段时间,发送一次心跳协议,双方维持连接。

 

 

 

Python 套接字错误: [Errno 104] 对等方重置连接 - 堆栈溢出 (stackoverflow.com)

posted @ 2023-02-23 14:50  青城杂文录  阅读(3303)  评论(0编辑  收藏  举报