我正在尝试实现一个简单的多线程TCP服务器。当只有一个连接的客户端时,它运行良好,但是当同时连接两个客户端时,第一个客户端的线程有时会收到必须由第二个客户端接收的消息。如何处理他的问题?
class ClientThread(Thread):
def __init__(self, ip, port):
Thread.__init__(self)
self.ip = ip
self.port = port
#...
def run(self):
while True:
try:
data = conn.recv(1024)
#...
except ConnectionResetError:
break
TCP_IP = '0.0.0.0'
TCP_PORT = 1234
BUFFER_SIZE = 1024
tcpServer = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpServer.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
tcpServer.bind((TCP_IP, TCP_PORT))
threads = []
while True:
tcpServer.listen(4)
(conn, (ip, port)) = tcpServer.accept()
newthread = ClientThread(ip, port)
newthread.start()
threads.append(newthread)
for t in threads:
t.join()
答案 0 :(得分:1)
我发现了这个错误。这里data = conn.recv(1024)
conn
是全局变量,因此它是最后连接的客户端的套接字,并且所有线程都试图从中接收数据。以下代码效果很好:
class ClientThread(Thread):
def __init__(self, ip, port, conn):
Thread.__init__(self)
self.ip = ip
self.port = port
self.conn = conn
#...
def run(self):
while True:
try:
data = self.conn.recv(1024)
#...
except ConnectionResetError:
break
........
newthread = ClientThread(ip, port, conn)
答案 1 :(得分:0)
我认为listen
调用应该不在循环中。它使您的服务器能够接受连接,只需要调用一次。