百人炸金花 python学习笔记(7)-远程主机强行关闭了现有连接

日期:2021-01-22 01:17:15 浏览量: 120

python远程主机强行关闭了现有的连接套接字超时设置errno 10054

python socket.error:[Errno 10054]现有连接被远程主机强行关闭。问题解决方法:

几天前,我使用python来读取网页。由于网站上使用了大量urlopen操作,因此它将被该网站标识为攻击。有时,不再允许下载。造成urlopen()后,request.read()被卡在那里。最后,将抛出errno 10054.。

aspnet 远程主机强迫关闭了一个现有的连接_aspnet连接sql数据库 webconfig_aspnet 40 服务器 主机

此错误是对等方重置连接。也就是说亚博电子竞技俱乐部 ,传奇的远程主机将重置连接。原因可能是套接字超时太长。也可能是在request = urllib.request.urlopen(url);之后没有执行request.close()操作;可能还有几秒钟没有睡眠,这使该网站认为这种行为是攻击。

具体解决方案如下代码:

aspnet连接sql数据库 webconfig_aspnet 40 服务器 主机_aspnet 远程主机强迫关闭了一个现有的连接

import socket
import time
timeout = 20  
socket.setdefaulttimeout(timeout)#这里对整个socket层设置超时时间。后续文件中如果再使用到socket,不必再设置
sleep_download_time = 10
time.sleep(sleep_download_time) #这里时间自己设定
request = urllib.request.urlopen(url)#这里是要读取内容的url
content = request.read()#读取,一般会在这里报异常
request.close()#记得要关闭

因为urlopen之后的read()操作实际上调用了套接字层的某些函数。因此凤凰彩票app ,通过设置默认的套接字超时时间,网络可以自行断开连接。无需在read()上永远等待。

aspnet 40 服务器 主机_aspnet 远程主机强迫关闭了一个现有的连接_aspnet连接sql数据库 webconfig

当然暴龙电竞 ,您也可以编写一些try和aspnet 远程主机强迫关闭了一个现有的连接ag真人 ,除了在外层,例如:

 try:
            time.sleep(self.sleep_download_time)
            request = urllib.request.urlopen(url)
            content = request.read()
            request.close()
            
        except UnicodeDecodeError as e:
               
            print('-----UnicodeDecodeError url:',url)
            
        except urllib.error.URLError as e:
            print("-----urlError url:",url)
   
        except socket.timeout as e:
            print("-----socket timout:",url)

通常来说,没有问题。在我这么说之前,我测试了数千个网页的下载。但是,如果您下载了成千上万个文件,则我进行了测试aspnet 远程主机强迫关闭了一个现有的连接,ms仍然会跳出该异常。可能是time.sleep()的时间太短,或者网络突然中断了。我用urllib.request.retrieve()测试了它凤凰彩票app ,发现连续下载数据时,总会出现故障。

处理它的简单方法是:首先参考我的文章:python检查点的简单实现。首先执行检查点。然后,将上面的代码置为True时将用尽所有异常。请参见下面的伪代码:

aspnet 远程主机强迫关闭了一个现有的连接_aspnet 40 服务器 主机_aspnet连接sql数据库 webconfig

ef Download_auto(downloadlist,fun,sleep_time=15):
    while True:        
        try: # 外包一层try 
            value = fun(downloadlist,sleep_time) # 这里的fun是你的下载函数,我当函数指针传进来。
           # 只有正常执行方能退出。
            if value == Util.SUCCESS:
                break
        except : # 如果发生了10054或者IOError或者XXXError
            sleep_time += 5 #多睡5秒,重新执行以上的download.因为做了检查点的缘故,上面的程序会从抛出异常的地方继续执行。防止了因为网络连接不稳定带来的程序中断。
            print('enlarge sleep time:',sleep_time)

但是,如果找不到相应的网页,则需要另一个过程:

# 打印下载信息
def reporthook(blocks_read, block_size, total_size):
    if not blocks_read:
        print ('Connection opened')
    if total_size < 0:
        print ('Read %d blocks' % blocks_read)
    else:
        # 如果找不到,页面不存在,可能totalsize就是0,不能计算百分比
        print('downloading:%d MB, totalsize:%d MB' % (blocks_read*block_size/1048576.0,total_size/1048576.0))
      
def Download(path,url):
#url = 'http://downloads.sourceforge.net/sourceforge/alliancep2p/Alliance-v1.0.6.jar'
    #filename = url.rsplit("/")[-1]
    try:
    # python自带的下载函数
        urllib.request.urlretrieve(url, path, reporthook)
    except IOError as e: # 如果找不到,好像会引发IOError。
        print("download ",url,"/nerror:",e)
    print("Done:%s/nCopy to:%s" %(url,path))