python - 使用套接字和线程,我的客户不会保持连接
问题描述
我的服务器循环有以下代码:
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”,到目前为止一切都很好。但是,如果客户端再次响应并说“再见”之类的话,它会以某种方式由顶部代码块中的主服务器循环处理,我会收到“新连接!=>”消息。我不希望在这个循环中处理客户端,我希望在他们自己预先存在的线程中处理它们。
出于某种原因,当客户回复新数据时,他们会退出他们的线程。循环似乎甚至没有被打破,因为它从来没有说“客户端断开连接”。
请帮忙。谢谢。
解决方案
推荐阅读
- dart - 在颤振/飞镖中:如何随机选择列表中的多个项目?
- php - 为什么它在 REST 请求中返回 null
- python - 将文本文件中的字符串拆分为不同的文本文件
- reactjs - 我的问候,项目托管时反应路由的一些问题
- azure - Azure 前门和 DNS 配置
- delphi - 专注于delphi中的radiogroup时如何响应按键
- android - 在颤动中使用下拉选择更改表单字段?
- python-3.x - 如何使用 imread 读取图像?
- java - 如何从PDF java中检测颜色
- javascript - 如何从另一个集合文档中通过 id 获取名称用户 id 被引用 firestore