TCP连接 客户端连接服务器后服务器端中断时出现 [WinError 10054] 远程主机强迫关闭了一个现有的连接。 的解决方法

项目中遇到问题:在客户端与服务器端正常连接时拔掉网线也就相当于把连接强行断开,此时客户端就会出现该错误:
[WinError 10054] 远程主机强迫关闭了一个现有的连接。
此时要进行处理就需要先找到切入点,此时的切入点就是找到抛出异常的位置,在异常处理中处理此部分问题,异常处理可不是简单的打印异常就可以了啊!

class socketCreateStoppable(threading.Thread):
    """Thread class with a stop() method. The thread itself has to check
    regularly for the stopped() condition."""

    def __init__(self,server_ip, server_port,macNumA,macNumB,distanceListA,distanceListB,timestrapListA,timestrapListB):
        super(socketCreateStoppable, self).__init__()
        self._stop_event = threading.Event()
        #print('server_ip',server_ip_list)
        #print(time.localtime(time.time()))
        self.server_ip = server_ip
        self.server_port = server_port
        self.tcp_client = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
        self.macNumA = macNumA
        self.macNumB = macNumB
        self.distanceListA = distanceListA
        self.distanceListB = distanceListB
        self.timestrapListA = timestrapListA
        self.timestrapListB = timestrapListB

    def stop(self):
        #print(time.time())
        print('#'*20)
        self._stop_event.set()
        self.tcp_client.close()   # 在停止的时候将tcp_client关掉
        print(time.time(),'stop success')
        logging.warning('stop success')

    def stopped(self):
        return self._stop_event.is_set()

    def run(self):
        # print("running",threading.Thread.getName(self))
        logging.debug("%s is start,server ip is %s,server port is %d" %(threading.Thread.getName(self),self.server_ip,self.server_port))
        # Thread-3elf.args is stop;the reason is check 404 by checkSelf
        while True:
            try:
                # self.tcp_client.settimeout(10)
                # print("self addr is:",self.server_port,self.server_ip)
                self.tcp_client.connect((self.server_ip, self.server_port))
                # print('server_ip:', self.server_ip)
                while True:
                    # 3.收发
                    recv_content = self.tcp_client.recv(1024)
                    #print(type(recv_content))
                    self.dataList = list(recv_content)
                    #print(self.dataList)
                    self.check_struct()
            except Exception as e:
                print(e)
                logging.error(e)
                self.tcp_client.close()
                self.stop()
                #time.sleep(2)
            time.sleep(1)
            if self.stopped():
                break

    def check_struct(self):
        # numA代表A的mac码 numB代表B的mac码
        # distanceListA与B分别代表当前基站与距离AB标签的距离
        # timestrapList代表是写AB时的时间戳,如果有某一个时间戳不更新了,会给其赋值一个很大的数
        if len(self.dataList) == 23:
            if self.dataList[0] == 170 and self.dataList[2] == 17 and self.dataList[-1] == 126:
                macList = self.dataList[3:9]
                length = (self.dataList[18] * 256 + self.dataList[19]) * 0.01
                if macList == self.macNumA:
                    self.distanceListA.append(length)
                    self.timestrapListA.append(time.time())
                    #print()
                elif macList == self.macNumB:
                    self.distanceListB.append(length)
                    self.timestrapListB.append(time.time())
                else:
                    print('mac is error')
            else:
                print('information error')
                #print(1)
        elif len(self.dataList) == 0:
            print('connected is disconnecting')
            self.tcp_client.close()
            self.stop()

    # 自毁程序,如果检测到一直为404,将本线程杀死
    def checkSelf(self):
        self.numListA = self.distanceListA[-5:]
        self.numListB = self.distanceListB[-5:]
        self.avgA = sum(self.numListA)/len(self.numListA)
        self.avgB = sum(self.numListB)/len(self.numListB)

        if abs(self.avgA-404)<1 or abs(self.avgB-404)<1:
            logging.warning("%s is stop;the reason is check 404 by checkSelf" %threading.Thread.getName(self))
            self.tcp_client.close()
            self.stop()

其中用到的TCP客户端亦然是可以stop的线程实现的,可以在检测到异常之后关掉本线程,在外面通过另一个线程检测,当发现该端口已经关闭时再重新起一个线程连接TCP服务器,IP和PORT和当前的线程一样,这样就解决了。
在进行线程重启时必须要做到的是在关闭线程前把该连接关掉 即:self.tcp_client.close()

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
[WinError 10054] 远程主机强迫关闭一个现有连接。这个错误是网络连接错误,通常是由于远程主机关闭了与你的计算机的连接造成的。这种错误可能会在使用Python爬虫或访问网络资源出现。原因可能是网络问题、服务器故障、防火墙设置等。 要解决这个问题,可以尝试以下几种方法: 1. 检查网络连接:确保你的计算机与远程主机之间的网络连接正常。可以尝试重新连接网络或者使用其他网络进行尝试。 2. 检查远程主机状态:确认远程主机是否正常工作。如果远程主机出现故障或维护,可能会导致连接关闭。可以联系远程主机管理员或等待一段间再尝试连接。 3. 检查防火墙设置:有候防火墙设置会阻止你的计算机与远程主机建立连接。可以检查你的防火墙设置,并确保允许与远程主机连接。 4. 使用合适的访问方式:如果你使用的是Python爬虫,可以尝试使用合适的爬虫库或模块来建立连接,如requests库。这些库通常提供了更稳定的网络连接方式。 总的来说,[WinError 10054] 远程主机强迫关闭一个现有连接一个网络连接错误,可以通过检查网络连接远程主机状态、防火墙设置以及使用合适的访问方式来解决。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【Python 爬虫错误】[WinError 10054] 远程主机强迫关闭一个现有连接。](https://blog.csdn.net/zikizhh/article/details/104531875)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [seaborn urllib.error.URLError: < urlopen error [WinError 10054] 远程主机强迫关闭一个现有连接。...](https://blog.csdn.net/qq_43495412/article/details/113089449)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值