【问题标题】:Python - Thread with socket won't stopPython - 带有套接字的线程不会停止
【发布时间】:2014-10-18 01:09:48
【问题描述】:

我正在编写一个简单的基于服务器的聊天程序。我正在使用线程。一切正常,但要停止程序,我必须手动终止它,因为正在搜索新用户的线程不会终止,因为 socket.accep() 函数仍在运行。我试图通过关闭套接字来解决这个问题,但不知何故,这并没有成功。这是我的用户搜索线程代码:

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初学者

【问题讨论】:

    标签: python multithreading sockets python-3.x


    【解决方案1】:

    如何也为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!")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多