簡體   English   中英

如何在不關閉任何這些連接的情況下處理來自多個客戶端 sockets 的數據 stream?

[英]How to process data stream from multiple client sockets without closing any of those connections?

我有一個服務器,它接受來自客戶端套接字的 JSON 數據的 stream 數據。 服務器需要永遠保持所有連接打開並處理來自它們的數據,但我的代碼的當前版本只能處理單個連接,因為一旦建立第一個連接,第二個 while 循環就永遠不會結束。

import socket

IP = '127.0.0.1'
PORT = 1235
BUFFER = 10
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((IP, PORT))
server_socket.listen(10)
print(f"Listening for incoming connections @ {IP}:{PORT}")


while True:
    client_socket, client_address = server_socket.accept()
    print(f"Established connection with {client_address}")
    while True:
        received_message = client_socket.recv(BUFFER).decode('utf-8')
        while '}' not in received_message:
            received_message += client_socket.recv(BUFFER).decode('utf-8')
        print(client_address, received_message)
        client_socket.send("Message received".encode('utf-8'))

能夠通過實現線程來解決問題。 如果有人想使用它,這是工作代碼。

import socket
from _thread import *

IP = '127.0.0.1'
PORT = 1235
BUFFER = 100
thread_count = 0
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((IP, PORT))
server_socket.listen(10)


def threaded_client(client_socket, address):
    while True:
        received_message = client_socket.recv(BUFFER).decode('utf-8')
        while '}' not in received_message:
            received_message += client_socket.recv(BUFFER).decode('utf-8')
        print(client_address, received_message)
        client_socket.send("Message received.".encode('utf-8'))


while True:
    client_socket, client_address = server_socket.accept()
    print(f"Established connection with {client_address}")
    start_new_thread(threaded_client, (client_socket, client_address))
    thread_count += 1
    print(thread_count)

您面臨的主要問題是幾乎所有 python 的 IO 都是阻塞的。 這意味着當您想要讀取或寫入文件或在這種情況下寫入套接字時,程序的執行將停止。 標准解決方案是通過threading -library 使用線程,但還有許多其他選項。

我建議觀看David Beazley 的關於並發的視頻,它很好地涵蓋了這個主題,它可能會有點復雜,但那是因為它很快就涵蓋了很多領域!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM