python - 如何限制一个套接字的连接数?
问题描述
根据我对这段代码的理解:
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)
*服务器与选择库一起使用,在我看来这不是问题......
如何限制客户端与服务器的连接数?
解决方案
正如您在问题的评论中提到的那样,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
阵列不会保持关闭的连接。而且,您必须对这些连接进行某种异步处理,因为在这种方法中,一次只能处理一个活动连接。
推荐阅读
- java - Ctrl-Shift-I 检查快捷方式不起作用。充当制表键
- javascript - 服务:找不到命令React js部署
- java - ViewBinding 与 Java11,AndroidStudio 总是显示错误(但运行没有任何问题)
- java - JSON子类缺少类字段输出
- elasticsearch - 在 Kibana 索引中获得最高索引率 (/s) 和搜索率的更可靠方法。每个过去的时间段
- shell - 创建指向与 $PATH 中指定的 $HOME/bin 一起使用的远程目录的 $HOME/bin 符号链接
- asp.net-mvc - ASP .NET MVC Redirecttoaction 将参数传递给 Index 但值为空
- java - 如何在不更改实时数据库中的downloadUrl的情况下更新android中FirebaseStorage中的位图图像
- servicenow - 如何在 onChange() 上向记录生产者添加小部件弹出窗口?
- web-scraping - 如何通过 Google Sheet Apps Script 从tiprank 中抓取?