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()
添加回答
舉報
