You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制Python Socket服务端的最大客户端连接数量为3

Socket服务端限制最大3连接+客户端互通实现方案

核心实现逻辑

  • 定义最大连接数常量做接入阈值校验
  • 维护全局连接计数器,客户端接入/断开时同步更新计数
  • 维护活跃客户端连接列表,用于实现跨客户端消息转发
  • 新增异常兜底逻辑,保证计数准确性和资源正确释放

修改后的完整服务端代码

import socket
from _thread import *

# 基础配置
PORT = 5050
HOST = socket.gethostbyname(socket.gethostname())
ADDR = (HOST, PORT)
# 新增:最大允许连接数
MAX_CONNECTIONS = 3

ThreadCount = 0
# 新增:存储所有活跃客户端连接,用于消息转发
active_clients = []

tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
    tcp.bind(ADDR)
except socket.error as e:
    print(str(e))

print("等待客户端连接")
tcp.listen(5)


def threaded_client(connection, client_addr):
    global ThreadCount
    connection.send(str.encode('欢迎接入服务端'))
    try:
        while True:
            data = connection.recv(2048)
            if not data:
                break
            # 实现客户端之间消息转发
            send_msg = f"客户端[{client_addr[0]}:{client_addr[1]}]发送:{data.decode('utf-8')}"
            print(send_msg)
            # 遍历所有活跃客户端,转发给除发送方外的所有人
            for client in active_clients:
                if client != connection:
                    try:
                        client.sendall(str.encode(send_msg))
                    except:
                        # 转发失败说明客户端已断开,清理资源
                        client.close()
                        if client in active_clients:
                            active_clients.remove(client)
    finally:
        # 客户端断开时统一清理资源,更新计数
        connection.close()
        if connection in active_clients:
            active_clients.remove(connection)
        ThreadCount -= 1
        print(f"客户端{client_addr[0]}:{client_addr[1]}已断开,当前连接数:{ThreadCount}")


while True:
    Client, address = tcp.accept()
    # 新增:连接数阈值校验
    if ThreadCount >= MAX_CONNECTIONS:
        Client.send(str.encode("当前服务端连接已满,最多支持3个客户端同时接入,本次连接已关闭"))
        Client.close()
        print(f"拒绝连接:{address[0]}:{address[1]},连接数已达上限")
        continue
    # 连接数未达上限,正常接入
    print(f"成功接入:{address[0]}:{address[1]}")
    active_clients.append(Client)
    start_new_thread(threaded_client, (Client, address))
    ThreadCount += 1
    print(f"当前连接数:{ThreadCount}")

# 修复原代码变量名错误
tcp.close()

客户端代码修复(原代码存在语法错误)

import socket

Client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
PORT = 5050
HOST = socket.gethostbyname(socket.gethostname())
ADDR = (HOST, PORT)

print("尝试连接服务端")
try:
    Client.connect(ADDR)
except socket.error as e:
    print(str(e))
    exit()

# 接收服务端欢迎信息
Response = Client.recv(1024)
print(Response.decode('utf-8'))

try:
    while True:
        Input = input('请输入要发送的内容:')
        Client.send(str.encode(Input))
        # 接收其他客户端转发的消息/服务端返回
        Response = Client.recv(1024)
        print(Response.decode('utf-8'))
except:
    print("与服务端连接断开")
finally:
    # 修复原代码变量名错误
    Client.close()

关键修改说明

  • 接入限制逻辑:每次新连接进来先判断当前连接数是否达到3,达到则直接返回提示后关闭连接,不会启动新线程占用资源
  • 计数准确性保证:用try...finally块保证客户端无论正常断开还是异常退出,都会正确减少连接计数、清理活跃列表
  • 客户端互通实现:通过全局活跃连接列表,收到任意客户端消息后转发给其他所有在线客户端,实现跨客户端数据传输
  • 修复了原代码中socket变量名拼写错误、语法空格错误等问题

内容的提问来源于stack exchange,提问作者Nuno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 08:12:00