2 回答

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超5個(gè)贊
您的客戶端處理程序線程使用conn在主線程中分配的變量中的套接字來(lái)接收和發(fā)送數(shù)據(jù)?;旧希偸侵皇褂脛?chuàng)建的最后一個(gè)連接。
這通常在第二個(gè)客戶端的輸出中變得可見(jiàn),就在啟動(dòng)它之后:
Client B received data: this is client A
從此時(shí)起,兩個(gè)客戶端處理程序線程都只為客戶端 B 服務(wù),因?yàn)檫@部分client功能......
data = conn.recv(2048)
conn.send(data)
...使用conn主線程中的這個(gè)(套接字),每次新客戶端連接到服務(wù)器時(shí)都會(huì)被覆蓋:
conn, addr = tcpServer.accept()
此時(shí)客戶端 A 等待來(lái)自服務(wù)器的數(shù)據(jù):
data2 = tcpClientA.recv(BUFFER_SIZE)
但是由于服務(wù)器中的兩個(gè)客戶端處理程序線程只偵聽(tīng)和寫(xiě)入客戶端 B 連接時(shí)創(chuàng)建的套接字,因此客戶端 A 進(jìn)程不再接收數(shù)據(jù)并無(wú)限期地阻塞等待一些數(shù)據(jù)。
您已經(jīng)將相應(yīng)的連接傳遞給您的客戶端處理程序線程...
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貢獻(xiàn)2037條經(jīng)驗(yàn) 獲得超6個(gè)贊
您的原始client函數(shù)沒(méi)有使用傳入的連接,而是使用conn在每個(gè)連接上覆蓋的全局變量。 ip是傳遞給的連接client。
由于您的服務(wù)器代碼導(dǎo)入了 SocketServer,因此請(qǐng)使用它并簡(jiǎn)化代碼。此代碼將為每個(gè)客戶端連接創(chuàng)建一個(gè)線程。 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()
添加回答
舉報(bào)