我正在编写一个带有客户端/服务器模型的简单套接字api。我只是使用socket.listen backlog参数进行测试,看看它是否真的丢弃了新连接,但由于某种原因它没有按预期工作,下面是我的代码。
import socket
import sys
from threading import Thread
HOST = ('localhost', 55555)
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(HOST)
print('Bind successful')
except socket.error as e:
print('Error ocurred ')
print('Listening for connections')
sock.listen(1)
def client_conn(conn):
while True:
# waiting for data to be received
data_recv = conn.recv(1024)
if not data_recv:
print('No data recieved from the client')
conn.close()
break
reply = 'Okay ' + data_recv.decode()
conn.send(reply.encode('utf-8'))
while True:
# waiting for connections
conn, client = sock.accept()
print('Recieved connection from {}:{}'.format(client[0], client[1]))
conn.send(b'Hiii')
Thread(target=client_conn, args=(conn, )).start()
sock.close()
Server.py
$ python3.6 /Programs/sockets/server.py
Bind successful
Listening for connections
Recieved connection from 127.0.0.1:33402
Recieved connection from 127.0.0.1:33408
Recieved connection from 127.0.0.1:33414
正如您所看到的,我从三个客户端连接起来,似乎所有人都可以连接并与服务器进行通信。
有人可以解释一下吗?
答案 0 :(得分:0)
以下是socket.listen
的{{3}}:
socket.listen(积压)
侦听对套接字的连接。backlog
参数指定最大排队数 连接应该至少为0;最大值是 系统相关(通常为5),最小值被强制为0。
backlog
的{{1}}参数并未规定服务器可以维护的连接数,而是指示有多少传入连接可以排队并在其他
因此,在socket.listen(backlog)
的情况下,服务器可以有许多打开的连接,但它只能处理在特定时刻对它进行的两个传入连接,即它处理第一个连接时(通过分配资源等) 。)第二个连接在队列中等待。如果在同一时刻还有第三个传入连接,它将被丢弃。
注意强>:
server.listen(1)
个连接和open
个连接之间存在差异。您的服务器可以维护许多同时打开的连接,同时它只能处理少量的同时传入连接。在您的情况下,这3个连接是incoming
。