Python - 套接字线程无法停止

0 投票
2 回答
2159 浏览
提问于 2025-04-18 18:23

我正在编写一个简单的基于服务器的聊天程序。我使用了线程。一切运行得很好,但要停止程序,我必须手动终止它,因为负责寻找新用户的线程无法结束,因为socket.accep()这个函数还在运行。我试着通过关闭socket来解决这个问题,但似乎没有成功。这是我用于用户搜索线程的代码:

import socket, time
from threading import Thread
from userHandling import UserHandler

class UserSearcher(Thread):

    def __init__(self):
        print("Thread: User searching is will start now!")
        Thread.__init__(self)

    def run(self):
        self.__uH = UserHandler()
        self.__tcpListener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.__tcpListener.bind(("", 2030))
        self.__tcpListener.listen(5)
        while True:
            try:
                self.__komm, self.__tcpAddr = self.__tcpListener.accept()
                self.__tcpMsg = self.__komm.recv(1024)
                self.__uH.add(self.__tcpMsg.decode(), self.__tcpAddr[0])
            except:
                print("Searching for chat members failed! Is the system shutting down?")
                break

    def stop(self):
        self.__tcpListener.close()
        time.sleep(1)
        print("Thread: User searching will quit NOW!")
        pass

我看不出哪里有错误 :/ 感谢一位Python初学者

2 个回答

0

可以考虑为这个 while 循环设置一个标志位:

class UserSearcher(Thread):

    def __init__(self):
        print("Thread: User searching is will start now!")
        Thread.__init__(self)

    def run(self):
        self.__uH = UserHandler()
        self.__tcpListener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.__tcpListener.bind(("", 2030))
        self.__tcpListener.listen(5)
        self.running = True
        while self.running:
            try:
                self.__komm, self.__tcpAddr = self.__tcpListener.accept()
                self.__tcpMsg = self.__komm.recv(1024)
                self.__uH.add(self.__tcpMsg.decode(), self.__tcpAddr[0])
            except:
                print("Searching for chat members failed! Is the system shutting down?")
                break

    def stop(self):
        self.__tcpListener.close()
        self.running = False
        time.sleep(1)
        print("Thread: User searching will quit NOW!")
        pass
2

使用 socket.shutdown() 来代替 close()

import socket, time
from threading import Thread

class UserSearcher(Thread):

    def __init__(self):
        print("Thread: User searching is will start now!")
        Thread.__init__(self)

    def run(self):
        self.__tcpListener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.__tcpListener.bind(("", 2030))
        self.__tcpListener.listen(5)
        while True:
            try:
                self.__komm, self.__tcpAddr = self.__tcpListener.accept()
                self.__tcpMsg = self.__komm.recv(1024)
                print(self.__tcpMsg)
            except:
                print("Searching for chat members failed! Is the system shutting down?")
                break

    def stop(self):
        self.__tcpListener.shutdown(socket.SHUT_RDWR)
        time.sleep(1)
        print("Thread: User searching will quit NOW!")

撰写回答