首页 > 解决方案 > 使用套接字和线程,我的客户不会保持连接

问题描述

我的服务器循环有以下代码:

    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server.bind((host, port))
    while True:
        server.listen(1)
        clientsock, clientAddress = server.accept()
        self.total_clients += 1
        self.modules['logger'].log("login", "New connection! => " + str(clientAddress))
        self.clients[self.total_clients] = (Client(clientAddress, clientsock, self.total_clients, self.modules))
        self.clients[self.total_clients].start()

基本上有人连接到套接字,然后他们被放置在第二行到最后一行的那个循环中(实例化客户端类的那个)。客户端类如下:

class Client(threading.Thread):
    def __init__(self, addr, clientsocket, thread_id, modules):
        threading.Thread.__init__(self)

        self.csocket = clientsocket
        self.addr = addr
        self.thread_id = thread_id
        self.modules = modules

        return

    def run(self):
        while True:
            data = self.csocket.recv(2048)
            if(len(data) > 1):
                data = data.decode()
                if data == 'bye':
                    break
                self.clientLog("Data received: {" + data + "}")
                self.parseCatch(self.modules['parser'].parse(data))
        print ("Client ", clientAddress , " disconnected...")

所以基本上我希望程序像这样工作:客户端连接到套接字。然后将它们无限期地放入客户端类线程中的 run() 循环中,以用于它们发送的任何其他内容,并且循环响应某些数据包(这是在我没有包含的 parseCatch() 函数中完成的,因为它只是一个简单的“如果 x 收到发送 y”)。

无论如何,该程序不是那样运行的。正如它现在工作的那样,客户端连接到套接字并被放入客户端类线程中的 run() 循环中。到目前为止这很好。然后他们发送一个特定的数据包,假设他们发送“嗨”。这是在底部客户端类的运行循环中的“数据”中收到的,假设我用self.csocket.send('hi back');. 这工作正常。他们的客户收到回信。但是,如果他们发回一些东西,比如再见,它就会被视为一个全新的客户。

所以不知何故,当这个任意客户端回复我在 Client() 线程中发送的数据包时,它们被视为一个全新的连接。因此,如果客户端发送“hi”,服务器发送“hi back”,到目前为止一切都很好。但是,如果客户端再次响应并说“再见”之类的话,它会以某种方式由顶部代码块中的主服务器循环处理,我会收到“新连接!=>”消息。我不希望在这个循环中处理客户端,我希望在他们自己预先存在的线程中处理它们。

出于某种原因,当客户回复新数据时,他们会退出他们的线程。循环似乎甚至没有被打破,因为它从来没有说“客户端断开连接”。

请帮忙。谢谢。

标签: pythonmultithreadingsocketsnetworking

解决方案


推荐阅读