如何在不关闭任何这些连接的情况下处理来自多个客户端套接字的数据流?

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

我有一个服务器,它接受来自客户端套接字的 JSON 数据流。服务器需要永远保持所有连接打开并处理来自它们的数据,但我的代码的当前版本只能处理单个连接,因为一旦建立第一个连接,第二个 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'))

您面临的主要问题是几乎所有 python 的 IO 都是 阻塞。这意味着当您想要读取或写入文件或在这种情况下写入套接字时,程序的执行将停止。标准解决方案是通过 threading-library 使用线程,但还有许多其他选项。

我建议观看 David Beazley's video on concurrency,它很好地涵盖了这个主题!它可能会变得有点复杂,但那是因为它覆盖了很多地面相当快!

能够通过实施线程解决问题。如果有人想使用它,这是工作代码。

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)