python之socket.listen()参数实验

概述

本文通过代码实验socket.listen()方法参数的含义

语法

listen(backlog)
参数说明:
  • backlog:指定在拒绝连接之前,操作系统可以挂起的最大连接数量。
    python3.5以后,可不调用此方法
    如果未指定,则选择默认的合理值。
    如果指定,至少为1

官方解释

https://docs.python.org/3.6/library/socket.html?highlight=socket#socket.socket.listen

白话解释

当socket服务器端不能处理客户的的连接请求时,操作系统 可以接收 socket客户端 连接请求的最大数

实验

通过实验,感受该方法的作用

服务器端代码

import socket,time

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('0.0.0.0',9000))
s.listen(5)

while True:
    # 模拟服务器一直在处理耗时操作,无法接收请求
    time.sleep(1000)
    conn,addr=s.accept()
    conn.close()

客户端代码

import socket
i=0
for i in range(10000):
    s = socket.socket()
    s.connect(('127.0.0.1', 9000))
    print('conn num:',i)
    s.close()

实验1

现在windows中运行服务器端,然后运行客户端代码(客户端在任意平台运行都可以),客户端提示如下:

conn num: 0
conn num: 1
conn num: 2
conn num: 3
conn num: 4
Traceback (most recent call last):
  File "client.py", line 5, in <module>
    s.connect(('127.0.0.1', 9000))
ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。

运行5次报错,当服务器不能及时处理,那么队列中还能接受5个请求

实验

通过实验,了解在不同操作系统中,可以挂起的最大连接数量。

服务器端代码

s.listen()方法的值不能过大,在不同的操作系统中有极限值

import socket,time

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('0.0.0.0',9000))
# 先设置成5000
s.listen(5000)

while True:
    # 模拟服务器一直在处理
    time.sleep(1000)
    conn,addr=s.accept()
    conn.close()

实验2

现在windows中运行服务器端,然后运行客户端代码(客户端在任意平台运行都可以),客户端提示如下:

conn num: 197
conn num: 198
conn num: 199
Traceback (most recent call last):
  File "client.py", line 5, in <module>
    s.connect(('127.0.0.1', 9000))
ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。

运行200次才报错,说明在windows系统中,当服务器不能及时处理,那么队列中还能接受200个请求

实验3

现在linux中运行服务器端,然后运行客户端代码(客户端在任意平台运行都可以),客户端提示如下:

conn num: 125
conn num: 126
conn num: 127
conn num: 128
conn num: 129
Traceback (most recent call last):
  File "client.py", line 5, in <module>
    s.connect(('192.168.1.113', 9000))
TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没
有反应,连接尝试失败。

运行130次才报错,说明在linux系统中,当服务器不能及时处理,那么队列中还能接受130个请求