概述
本文通过代码实验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个请求