zoukankan      html  css  js  c++  java
  • Python中socket中的listen()里参数(数字)到底代表什么?

    在调用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允许的最大连接数)

  • 相关阅读:
    第二十一章流 1流的操作 简单
    第二十章友元类与嵌套类 1友元类 简单
    第十九章 19 利用私有继承来实现代码重用 简单
    第二十章友元类与嵌套类 2嵌套类 简单
    第十九章 8链表类Node 简单
    第二十一章流 3用cin输入 简单
    第十九章 10 图书 药品管理系统 简单
    第十九章 11图书 药品管理系统 简单
    第二十一章流 4文件的输入和输出 简单
    第十九章 12 什么时候使用私有继承,什么时候使用包含 简单
  • 原文地址:https://www.cnblogs.com/gaohuayan/p/11139397.html
Copyright © 2011-2022 走看看