2 回答
TA贡献1836条经验 获得超5个赞
您的客户端处理程序线程使用conn在主线程中分配的变量中的套接字来接收和发送数据。基本上,您总是只使用创建的最后一个连接。
这通常在第二个客户端的输出中变得可见,就在启动它之后:
Client B received data: this is client A
从此时起,两个客户端处理程序线程都只为客户端 B 服务,因为这部分client功能......
data = conn.recv(2048)
conn.send(data)
...使用conn主线程中的这个(套接字),每次新客户端连接到服务器时都会被覆盖:
conn, addr = tcpServer.accept()
此时客户端 A 等待来自服务器的数据:
data2 = tcpClientA.recv(BUFFER_SIZE)
但是由于服务器中的两个客户端处理程序线程只侦听和写入客户端 B 连接时创建的套接字,因此客户端 A 进程不再接收数据并无限期地阻塞等待一些数据。
您已经将相应的连接传递给您的客户端处理程序线程...
thread.start_new_thread(client, (conn, addr))
...你只需要使用它:
def client(ip,port):
while True:
data = ip.recv(2048) # receive from ip
ip.send(data) # send to ip
conn.close()
TA贡献2037条经验 获得超6个赞
您的原始client函数没有使用传入的连接,而是使用conn在每个连接上覆盖的全局变量。 ip是传递给的连接client。
由于您的服务器代码导入了 SocketServer,因此请使用它并简化代码。此代码将为每个客户端连接创建一个线程。 self.request是套接字连接:
#!python2
import SocketServer
class Handler(SocketServer.StreamRequestHandler):
def handle(self):
while True:
data = self.request.recv(2048)
if not data: break
self.request.sendall(data)
server = SocketServer.ThreadingTCPServer(('',2004),Handler)
server.serve_forever()
添加回答
举报