Socket.listen不重用新连接

时间:2017-12-29 08:15:23

标签: python sockets

我正在编写一个带有客户端/服务器模型的简单套接字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

正如您所看到的,我从三个客户端连接起来,似乎所有人都可以连接并与服务器进行通信。

有人可以解释一下吗?

1 个答案:

答案 0 :(得分:0)

以下是socket.listen的{​​{3}}:

  

socket.listen(积压)
  侦听对套接字的连接。   backlog参数指定最大排队数   连接应该至少为0;最大值是   系统相关(通常为5),最小值被强制为0。

backlog的{​​{1}}参数并未规定服务器可以维护的连接数,而是指示有多少传入连接可以排队并在其他

因此,在socket.listen(backlog)的情况下,服务器可以有许多打开的连接,但它只能处理在特定时刻对它进行的两个传入连接,即它处理第一个连接时(通过分配资源等) 。)第二个连接在队列中等待。如果在同一时刻还有第三个传入连接,它将被丢弃。

注意server.listen(1)个连接和open个连接之间存在差异。您的服务器可以维护许多同时打开的连接,同时它只能处理少量的同时传入连接。在您的情况下,这3个连接是incoming