脚本重启后存在连接错误

Posted

技术标签:

【中文标题】脚本重启后存在连接错误【英文标题】:Existing connection error after script restart 【发布时间】:2019-06-06 06:30:53 【问题描述】:

我在 Python 3.7 上执行 HTTP 请求,但如果在执行过程中出现一些错误并且脚本停止,所有新的 HTTP 请求(即使在重新启动脚本后)都会出现错误:[Errno 10054] An existing connection was forcibly closed by the remote host

我必须禁用/启用我的网络才能消除错误。这可能是由于我的 PC/OS 造成的,因为该脚本适用于 RaspberryPi,但不适用于我的 Windows 10。但我不知道如何修复它。

这里产生错误的最少代码:

import requests
import json
import urllib.request
import socket

    if __name__ == '__main__':

        params = json.dumps("toto": "ABCD").encode('utf-8')

        try:
            head = 'content-type': 'application/json'
            #replace http by https, to generate the error, re-writte http, and it will never work again
            url = 'http://www.google.com'
            with requests.post(url, data=params, headers=head) as response:
                print("All is OK: " + str(response))
        except (urllib.error.URLError, socket.timeout) as e:
            print("Error time out: " + str(e.args))
        except Exception as e:
            print("Uknown error: " + str(e.args))

一旦出现错误,如果我想安装新模块,即使 pip.exe 也会返回相同的错误。

edit1:我尝试了其他方法:

我有另一个只执行 SQL 请求的脚本,它运行良好。

但是一旦我遇到错误,即使这个也有问题: "Lost connection to mysql server during query (%s)" % (e,)) pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query ([WinError 10054] An existing connection was forcibly closed by the remote host)')

edit2:我在 Windows 上的 Ubuntu 上安装了 bash,我在同一台 PC 上做同样的事情,但“操作系统不同”,我得到 ProtocolError('Connection aborted.', RemoteDisconnected('Remote end closed connection without response',))

我在其他电脑(Windows 7)上试过,和我的问题一样。

@djvg 我检查了 openSSL 版本 (1.1.0i) 和 TSL 版本 (1.2),所以它看起来与您提供的 link 兼容。这是 pip freeze 的输出(感谢提示,顺便说一句我不知道):

certifi==2018.11.29 chardet==3.0.4 循环仪==0.10.0 idna==2.8 kiwisolver==1.0.1 matplotlib==3.0.2 numpy==1.15.4 PyMySQL==0.9.3 pyparsing==2.3.0 python-dateutil==2.7.5 requests==2.21.0 六==1.12.0 urllib3==1.24.1

@M.Spiller 我不使用“特殊网络”,如果我在我的专业网络上进行测试,它不起作用但出现另一个错误(可能是代理问题),所以我使用另一个没有特别安全性的网络.但我认为这不是安全问题,因为一旦脚本停止就会出现此错误。该脚本在树莓派上运行良好。可能是操作系统问题?就像网络板第一次没有正确关闭连接一样。但我不知道如何验证...

@UserX 我无法禁用防火墙:公司政治。我同意你的观点,这可能是原因。是否可以打开另一个连接?还是在脚本崩溃时强制关闭?

【问题讨论】:

不幸的是它对我有用(Ubuntu Bionic),所以我恐怕帮不了你,但只是作为美丽请求库的旁注 - 从 2.4.2 开始,你可以使用 requests.post(url, json="toto": "ABCD") 和它会处理其他所有事情。 可能是原始套接字? 我无法重现您的问题,您使用什么版本的请求库?也许标题中的“连接”参数会有所帮助:head = 'content-type': 'application/json', 'Connection':'close' 您是否尝试禁用防火墙? 尝试使用 Python 2.7, 3.5, 3.63.7 on Win 10(每次至少 5 次),以及每次我得到“一切正常:”。 【参考方案1】:

我回答我自己的问题:

就我而言这是防火墙问题。由于公司政策,我无法修改其参数,但使用没有防火墙的计算机可以正常工作。这不是一个软件解决方案,它是一种昂贵的解决方法,但总比没有好。

【讨论】:

以上是关于脚本重启后存在连接错误的主要内容,如果未能解决你的问题,请参考以下文章

服务器断电重启了,打开之后发现Oracle 数据库连接不上了,提示以下错误,哪位高人指点一下!!

重启后Windows10互联网连接问题。未找到硬件设备连接

错误集之LNMP平台对接redis服务出现的问题

如何使用 php 关闭与 Apache 的连接 MS 访问

关于vmware启动提示无法修复的错误的问题

WIN10远程连接时提示内部错误