亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python多線程兩個客戶端在一臺服務器上無限期地同時運行

Python多線程兩個客戶端在一臺服務器上無限期地同時運行

UYOU 2022-01-11 15:45:49
我試圖找出一個多線程問題,兩個客戶端永遠運行,同時向服務器發送 ping,而服務器不斷回顯消息。在發現一個客戶端/服務器如何永遠來回回顯之后,我研究了多線程。當我添加第二個客戶端時,它將接收第一個客戶端的最后一個輸出。然后,第二個客戶端將與服務器重復回顯,而第一個客戶端從未收到消息,將其凍結。我被困在這幾天,所以幫助會很好。無論如何,這是我用來測試的代碼:客戶端A.pyimport socketimport timehost = '127.0.0.1' port = 2004BUFFER_SIZE = 2000 tcpClientA = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcpClientA.connect((host, port))while True:    data = 'this is client A'    tcpClientA.send(data)    data2 = tcpClientA.recv(BUFFER_SIZE)    print " Client A received data:", data2Clientb.py與客戶端 A 相同,但帶有 ab服務器.pyimport socketimport timeimport threadfrom threading import Thread from SocketServer import ThreadingMixIn BUFFER_SIZE = 1024TCP_IP = '127.0.0.1' TCP_PORT = 2004tcpServer = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcpServer.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) threads = []def client(ip,port):    while True:        data = conn.recv(2048)        conn.send(data)    conn.close()print "Server waiting"tcpServer.bind((TCP_IP, TCP_PORT))tcpServer.listen(4)while True:    conn,addr=tcpServer.accept()    thread.start_new_thread(client,(conn,addr))tcpServer.close()
查看完整描述

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()


查看完整回答
反對 回復 2022-01-11
?
阿晨1998

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()


查看完整回答
反對 回復 2022-01-11
  • 2 回答
  • 0 關注
  • 294 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號