[英]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.