【问题标题】:How to limit the number of connections to a socket?如何限制一个套接字的连接数?
【发布时间】:2021-05-18 14:50:58
【问题描述】:

根据我对这段代码的理解:

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
port = 45671
server_socket.bind(("localhost", port))
server_socket.listen(2) #focus on this line

是否只有两个客户端可以与socket_server建立连接。

但是,我可以连接两个以上的客户端。

部分客户端代码:

HOST = 'localhost'
PORT = 45671
BUFSIZ = 1024
ADDR = (HOST,PORT)
client_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_sock.connect(ADDR)

*Server 与选择库一起使用,在我看来这不是问题...

如何限制客户端与服务器的连接数?

【问题讨论】:

  • listen() 似乎有明确的记录:它指定了系统在拒绝新连接之前允许的未接受连接的数量。如果您想限制同时连接的数量,您可以计算当前打开的连接数量,并根据您的需要采取多种操作:一旦您的限制达到,您可以简单地停止accept()-ing 任何更多连接到达;您也可以完全关闭服务器套接字。取决于你的行为。

标签: python sockets select client-server


【解决方案1】:

正如您问题的 cmets 中所述,listen() 参数的用途略有不同。

您必须自行管理连接。 一个例子可能是:

import socket
import logging

logger = logging.getLogger(__name__)


HOST = '127.0.0.1'  # Standard loopback interface address (localhost)
PORT = 8331        # Port to listen on (non-privileged ports are > 1023)

connections = []
MAX_CONNECTIONS = 2

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()

    logger.info(f"Starting server on {HOST}: {PORT} ...")

    while True:
        conn, addr = s.accept()
        if len(connections) >= MAX_CONNECTIONS:
            conn.sendall(f"Connection overflow. Max amount is {MAX_CONNECTIONS}".encode())
            continue

        connections.append((conn, addr))

        logger.info(f"Client connected: {addr}")
        while True:
            data = conn.recv(1024)
            if not data:
                break
            conn.sendall(data)

不过,您必须编写清理逻辑,以便您的 connections 数组不会保持关闭的连接。 此外,您必须对这些连接进行某种异步处理,因为在这种方法中,一次只能处理一个活动连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2010-09-19
    • 2017-04-04
    • 1970-01-01
    • 2021-12-30
    • 2013-04-17
    相关资源
    最近更新 更多