第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Python多線程兩個(gè)客戶端在一臺(tái)服務(wù)器上無(wú)限期地同時(shí)運(yùn)行

Python多線程兩個(gè)客戶端在一臺(tái)服務(wù)器上無(wú)限期地同時(shí)運(yùn)行

UYOU 2022-01-11 15:45:49
我試圖找出一個(gè)多線程問(wèn)題,兩個(gè)客戶端永遠(yuǎn)運(yùn)行,同時(shí)向服務(wù)器發(fā)送 ping,而服務(wù)器不斷回顯消息。在發(fā)現(xiàn)一個(gè)客戶端/服務(wù)器如何永遠(yuǎn)來(lái)回回顯之后,我研究了多線程。當(dāng)我添加第二個(gè)客戶端時(shí),它將接收第一個(gè)客戶端的最后一個(gè)輸出。然后,第二個(gè)客戶端將與服務(wù)器重復(fù)回顯,而第一個(gè)客戶端從未收到消息,將其凍結(jié)。我被困在這幾天,所以幫助會(huì)很好。無(wú)論如何,這是我用來(lái)測(cè)試的代碼:客戶端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服務(wù)器.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貢獻(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()


查看完整回答
反對(duì) 回復(fù) 2022-01-11
?
阿晨1998

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


查看完整回答
反對(duì) 回復(fù) 2022-01-11
  • 2 回答
  • 0 關(guān)注
  • 281 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)