-
在调用socket的时候,我们会使用到
listen()函数
,里面有个参数叫
backlog
, 例如:socket.listen(5). 那么这个数字5到底代表什么意思呢?
-
网上有很多种说法,讲的都是概念,很多都是复制粘贴,容易让人误解。
下面使用具体的代码片段来讲解:
-
这是一个电脑本机模拟客服端及服务端的程序,主要功能是建立socket连接后,客户端输入关键字查询对应的段子,服务器端返回结果。
-
服务器可以满足同时服务两个客户的查询操作
-
此程序中还包含了信号量和多线程
以listen(1),参数设置为1进行讲解,是不是将参数设置为1后,开启3个客服连接就会报错呢?
并不是!如下图所示:
那么问题来了!
-
问题1
:
如上例代码中,有listen(1),这个1是指什么?只能与1个socket建立链接吗? 为什么我用上面的代码可以创建大于1个的tcp连接却没报错,如果用网上其他人的说法理论上大于1个连接应该报错的!
因为
:listen(n)传入的值, n表示的是服务器拒绝(超过限制数量的)连接之前,操作系统可以挂起的最大连接数量。
n也可以看作是"排队的数量"
-
问题2
:
既然没有报错,为什么没有打印用户3的地址?
因为
:服务器正在处理用户1和用户2,没有空闲去接待用户3,所以用户3去排队了。
-
问题3
:
为什么服务器能同时处理用户1和用户2?
因为
:
这里用到了多线程和信号量,信号量设置为2,也就是允许并发数为2,服务器开启了两个线程,能同时分别处理用户1和用户2。
socket.listen(n)
简单来说,这里的nt表示socket的”
排队个数
“
-
一般情况下,一个进程只有一个主线程(也就是单线程),那么socket允许的最大连接数为: n + 1
-
如果服务器是多线程,比如上面的代码例子是开了2个线程,那么socket允许的最大连接数就是: n + 2
-
换句话说:排队的人数(就是那个n) + 正在就餐的人数(服务器正在处理的socket连接数) = 允许接待的总人数(socket允许的最大连接数)
socket中的listen中的数字到底代表什么?疑问解答总结疑问在调用socket的时候,我们会使用到listen()函数,里面有个参数叫backlog, 例如:socket.listen(5). 那么这个数字5到底代表什么意思呢?网上有很多种说法,讲的都是概念,很多都是复制粘贴,容易让人误解。解答下面使用具体的代码片段来讲解:这是一个电脑本机模拟客服端及服务端的程序,主要功...
1、修改用户进程可打开文件数限制
在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个
socket
句柄,每个
socket
句柄同时也是一个文件句柄)。可使用ulimit命令查看系统允许当前用户进程打开的文件数限制:
[sp
en
g@as4 ~]$ ulimit -n...
OK,首先写一个
python
socket
的server段,对开放三个端口:10000,10001,10002.krondo的例子
中
是每个server绑定一个端口,测试的时候需要分别开3个shell,分别运行.这太麻烦了,就分别用三个Thread来运行这些services.
import optparse
import os
import
socket
import time
from threading import Thread
import StringIO
txt = '''1111
def server(
list
en
_
socket
):
int
list
en
(int sockfd, int backlog); //成功返回0,失败返回-1
下面只讨论TCP UDP不做讨论(很少使用到
list
en
函数)
用法:函数应该在调用
socket
和bind这两个函数之后,accept函数之前调用。
作用:让服务器套接字sockfd进于监听状态。
sockfd:套接字,成功返回后进
close方法可以释放一个连接的资源,但是不是立即释放,如果想立即释放,那么在close之前使用shutdown方法
shut_rd() ——-关闭接受消息通道
shut_wr()——–关闭发送消息通道
shut_rdwr()——-连个通道都关闭
使用:在close()之前加上shutdown(num)即可 [shut_rd(), shut_wr(), shut_rdwr()分别
代表
num 为0 1 2 ]
(但是测试过close()关闭,发现如果关闭后,那么accept()得到的connection就马上不能用了【提示不能在非套接字上….】)
以上这篇浅谈
python
中
真正关闭sock
本文实例讲述了
Python
中
函数的
参数
定义和可变
参数
用法。分享给大家供大家参考。具体如下:
刚学用
Python
的时候,特别是看一些库的源码时,经常会看到func(*args, **kwargs)这样的函数定义,这个*和**让人有点费解。其实只要把函数
参数
定义搞清楚了,就不难理解了。
先说说函数定义,我们都知道,下面的代码定义了一个函数funcA
def funcA():
显然,函数funcA没有
参数
(同时啥也不干:D)。
下面这个函数funcB就有两个
参数
了,
def funcB(a, b):
print a
print b
调用的时候,我们需要使用函数名,加上圆括号扩
BUFSIZE=1024
ip_port = ('2.2.2.2',8081)
s=
socket
.
socket
(
socket
.AF_INET,
socket
.SOCK_STREAM)#创建套接字
s.setsockopt(
socket
.SOL_
SOCKET
,
socket
.SO_REUSEADDR, 1)
第一个
参数
sockfd为创建
socket
返回的文件描述符。
第二个
参数
backlog为建立好连接处于ESTABLISHED状态的队列的长度。
backlog的
最大
值128(linux原文描述如下):
If the backlog argum
en
t
`range()` 是
Python
内置函数之一,用于生成一个整数序列,常用于 `for` 循环
中
。
`range()` 函数接受三个
参数
,分别是 `start`, `stop`, 和 `step`。
* `start`: 整数序列的起始值,默认为 0。
* `stop`: 整数序列的终止值,不包括该值。必须指定该
参数
,且必须为整数。
* `step`: 整数序列
中
相邻两
个数
的步长(差值),默认为 1。
需要注意的是,`range()` 函数生成的是一个不可变的序列(
Python
3
中
为 range 对象),因此不能直接对其进行修改,但可以将其转换为其他可变序列类型(如列表)再进行操作。
下面是几个例子:
```
python
# 生成从 0 到 4 的整数序列
for i in range(5):
print(i)
# 生成从 2 到 8,步长为 2 的整数序列
for i in range(2, 9, 2):
print(i)
# 将 range 对象转换为列表
list
(range(5))