如何限制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
相关产品推荐
相关产品推荐

