【发布时间】:2021-09-13 22:17:30
【问题描述】:
我试图将 Python 服务器限制为仅接受来自一个客户端的连接,但我注意到 Python 服务器总是接受一个太多的连接。这是服务器代码:
import socket
import time
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(), 1234))
s.listen(0)
clientsocket, address = s.accept()
print(f"Connection from {address} has been established!")
while True:
time.sleep(1000)
clientsocket.send(bytes("Welcome to server 1!", "utf-8"))
我希望这一次只允许一个客户端连接,因为队列中不允许有任何客户端连接 (s.listen(0))。但是,我发现此代码允许我在出现错误之前连接两个客户端。这是我的客户正在连接:
>>> import socket
>>> socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect((socket.gethostname(), 1234))
>>> socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect((socket.gethostname(), 1234))
>>> socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect((socket.gethostname(), 1234))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it
第一个客户端被接受,这是预期的。第二个客户端成功连接,这是我没想到的,因为服务器已经有一个连接并且队列中允许 0 个连接。在第三个客户端尝试连接并被拒绝之前,我们不会失败。
如果我们将 listen() 参数设置为 1,我们将被允许 3 个连接(1 个当前连接,2 个在队列中)。如果我们将其增加到 2,则允许有 4 个连接(1 个当前连接,3 个在队列中)。这种模式仍在继续。
我如何指定我的服务器应该允许 1 个连接而不在队列中保留任何连接?
【问题讨论】:
-
无法复制。使用您的代码,当客户端连接时,我在服务器端收到 broken pipe 错误。
-
嘿抱歉我刚刚更新了服务器端代码。应该管用。我只是想简化代码,但意识到我设置它的方式,它会立即尝试将数据发送回一个不再存在的套接字,因为我们没有存储它。