九、基于多路复用的多客户端管理

作者:解琛
时间:2020 年 9 月 7 日

  • 九、基于多路复用的多客户端管理
    • 9.1 select
    • 9.2 用 select 实现处理多个 socket 客户端请求
      • 9.2.1 服务端
      • 9.2.2 客户端
      • 9.2.3 过程分析
    • 9.3 读写分离
      • 9.3.1 服务端
      • 9.3.2 多客户端连接测试

Python—I/O多路复用

在 python 中,select 函数是一个对底层操作系统的直接访问的接口,它用来监控 sockets、files 和 pipes,等待 IO 完成。

当有可读、可写或是异常事件产生时,select 可以实现对其的监测。

9.1 select

格式:rList, wList, eList = select.select(argv1, argv2, argv3, timeout)

参数:

  • argv1:监听序列中的句柄发生变化时,则获取发生变化的句柄添加到 rList 序列中;
  • argv2:监听序列中含有句柄时,则将该序列中所有的句柄添加到 wList 序列中;
  • argv3:监听序列中的句柄发生错误时,则将该发生错误的句柄添加到 eList 序列中;
  • timeout:设置阻塞时间,如果不设置则默认一直阻塞。

9.2 用 select 实现处理多个 socket 客户端请求

9.2.1 服务端

#!/usr/bin/env python
# coding=utf-8
import socket
import select
ip_port = ('127.0.0.1',9999)sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建 socket 对象;
sk.bind(ip_port)        # 绑定 IP、端口;
sk.listen(5)            # 监听;
sk.setblocking(False)   # 不阻塞;inputs = [sk,]
outputs = []
while True:rlist, wlist, eList = select.select(inputs, outputs, [], 0.5)print("inputs:", inputs)     # 查看 inputs 列表变化;print("rlist:", rlist)       # 查看 rlist 列表变化;for r in rlist:if r == sk:              # 如果 r 是服务端;conn, address = r.accept()inputs.append(conn)print (address)else:client_data = r.recv(1024)if client_data:      # 如果有数据,返回数据;r.sendall(client_data)else:                # 否则移除;inputs.remove(r)

9.2.2 客户端

#!/usr/bin/env python
# coding=utf-8
import socket
ip_port = ('127.0.0.1', 9999)sk = socket.socket()    # 创建 socket 对象;
sk.connect(ip_port)     # 通过 IP 和端口连接 server 端;
while True:inpu=input(">>:")sk.sendall(bytes(inpu,"utf8"))      # 给 server 端发送信息;server_reply = sk.recv(1024)        # 接受消息;print (str(server_reply,"utf8"))    # 打印消息;sk.close()  # 关闭连接;

9.2.3 过程分析

  • 启动服务端,这时 select 会一直监听服务端句柄,直到有客户端请求过来发生变化;
  • 当客户端有新的连接请求过来时,select 捕捉到服务端句柄发生变化,把变化的句柄加入到 rlist,所以这时 r == sk,接收这个链接并把句柄加入到 inputs 列表;
  • 现在,select 监听的就是两个句柄了。同理,当有多个链接请求过来时,都会把它添加到 inputs 列表中;
  • 当其中的一个客户端 A 发送信息过来时,select 会在监听的句柄列表中捕捉到客户端 A 这个句柄发生了变化,并把发生变化的句柄加入到 rlist,但这时 r 不等于 sk;
  • 执行另一步操作,接收返回数据;

9.3 读写分离

argv1 参数的概述,是监听 argv1 这个列表,当有发生变化时才会捕捉,并加入到 rlist。

argv2 参数,只要在这个列表里有值,每次都会加入到 wList,不同于 argv1,所以可以利用argv2参数实现读写分离。

在 argv3 的监听列表中,如果在跟某个 socket 连接通信过程中出了错误,就会把错误的句柄加到 eList ,所以再加个判断,当某个 socket 连接通信过程中出了错误,就把这个错误的连接对象在各个列表和字典中删除。

9.3.1 服务端

#!/usr/bin/env python
# coding=utf-8
import socket
import select
import queueip_port = ('127.0.0.1',9999)sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建 socket 对象;
sk.bind(ip_port)        # 绑定 IP、端口;
sk.listen(5)            # 监听;
sk.setblocking(False)   # 不阻塞;inputs = [sk,]
outputs = []
message={}
while True:rlist, wlist, eList = select.select(inputs, outputs, [], 0.5)# print("inputs:", inputs)     # 查看 inputs 列表变化;# print("rlist:", rlist)       # 查看 rlist 列表变化;for r in rlist:if r == sk:              # 如果 r 是服务端;conn, address = r.accept()inputs.append(conn)message[conn] = queue.Queue()   #每个新的句柄对应一个队列print (address)else:client_data = r.recv(1024)if client_data:      # 如果有数据,返回数据;outputs.append(r)message[r].put(client_data)    # 在指定队列中插入数据;else:                # 否则移除;inputs.remove(r)del message[r]   # 删除队列;for w in wlist:              # 如果 wlist 列表有值;try:data =message[w].get_nowait() # 去指定队列取数据;w.sendall(data)except queue.Empty:passoutputs.remove(w)        # 因为 output 列表只要有数据每次都会加入# wlist 列表,所以发送完数据都要移除;for e in eList:inputs.remove(e)         # 删除 inputs 监听的错误句柄;if e in outputs:         # 如果 outputs 里有也删除;outputs.remove(e)e.close()del message[e]           # 删除队列;

9.3.2 多客户端连接测试

使用两个客户端连接该服务器,服务器的终端输入如下。

xiechen@xiechen-Ubuntu:~/6.本地实验中心/2.python$ python3 server.py
('127.0.0.1', 33322)
('127.0.0.1', 33324)

客户端测试结果如下。

xiechen@xiechen-Ubuntu:~/6.本地实验中心/2.python$ python3 client.py
>>:jerome
jerome
>>:hello
hello
>>:

python 基于多路复用的多客户端管理相关推荐

  1. python基于值的自动内存管理方式_为什么说Python采用的是基于值的内存管理模式...

    展开全部 内存管理架构: 1.python的内存管理机制由两部分组成,其由PYMALLOC_DEBUG控制,在debug模式下的内存管理机制和正常模32313133353236313431303231 ...

  2. python基于值的自动内存管理方式是什么_Python采用的是基于值得自动内存管理方式。(2.0分)_学小易找答案...

    [多选题]下列有关关键绩效指标表述正确的是( ) [单选题]上级和员工之间以持续沟通来预防和解决员工实现绩效时可能发生的各种问题的过程,这是绩效管理的( )环节 [单选题]下列有关双因素理论的描述中, ...

  3. [附源码]计算机毕业设计Python+uniapp基于Android的大学生健康管理APPo1q3h(程序+源码+LW+远程部署)

    [附源码]计算机毕业设计Python+uniapp基于Android的大学生健康管理APPo1q3h(程序+源码+LW+远程部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目 ...

  4. python基于值的内存管理方式_python内存管理方式以及深拷贝,浅拷贝

    简单开篇,手绘结尾 1.pip常用工具命令: $pip download packagename==version #下载指定版本模块,但是不安装 $pip freeze>requirement ...

  5. python 服务端渲染_客户端渲染与服务端渲染

    后端渲染 服务器直接生成HTML文档并返回给浏览器,但页面交互能力有限.适用于任何后端语言:PHP.Java.Python.GO等. 客户端渲染(CSR) 页面初始加载的HTML文档中无内容,需要下载 ...

  6. java毕业设计——基于JSP+access的旅游管理系统设计与实现(毕业论文+程序源码)——旅游管理系统

    基于JSP+access的旅游管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于JSP+access的旅游管理系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下载开 ...

  7. python 释放变量所指向的内存_通俗易懂的Python垃圾回收机制及内存管理

    Python垃圾回收机制及内存管理 内存管理: 先定义一个变量 name='wxl' 那么python会在内存中开辟一小块区域存放"wxl",此时变量的值是我们真正想要存储的,wx ...

  8. 几款开源的图形化Redis客户端管理软件推荐

    几款开源的图形化Redis客户端管理软件推荐 摘要: Redis是一个超精简的基于内存的键值对数据库(key-value),一般对并发有一定要求的应用都用其储存session,乃至整个数据库.不过它公 ...

  9. pythondevp2p_以太坊GO、JAVA、PYTHON、RUBY、JS客户端介绍

    原标题:以太坊GO.JAVA.PYTHON.RUBY.JS客户端介绍 区块链兄弟社区,区块链技术专业问答先行者,中国区块链技术爱好者聚集地 作者:佚名 来源:CSDN 原文链接:http://blog ...

最新文章

  1. spring boot中@ResponseBody等注解的作用与区别
  2. CTFshow 反序列化 web272
  3. Python3NumPy——数组(2)之数学空间与NumPy空间
  4. 【Keras速成】Keras图像分类从模型自定义到测试
  5. 「后端小伙伴来学前端了」Element修改默认样式 | 记录自己学习前端踩坑日记
  6. 计算机理论在实际编程中的应用之我见
  7. linux系统udp通信程序,Linux UDP socket编程(UDP通讯模型) | C/C++程序员之家
  8. Delphi数据类型
  9. surround360
  10. unbuntu cmake安装mysql_ubuntu下编译安装mysql5.5
  11. 伺服扭矩模式怎么控制_气液增压缸是怎么增压的?气液增压缸好用吗?气液增压缸的原理及其伺服控制...
  12. python多进程解决多路视频流卡帧、掉帧、延时等问题
  13. 我们在 web 应用开发过程中经常遇到输出某种编码的字 符, 如 iso8859-1 等, 如何输出一个某种编码的字符串?...
  14. 微信小程序 百度SDK定位 坐标纠偏
  15. 胜利vs50线跟vs100线区别_BV线与BVR电线的区别
  16. echarts宽度随屏幕宽度改变自适应
  17. 一花一世界 一叶一菩提
  18. 大地测量常用的四种坐标系
  19. 【数据分析】2022 年将占据主导地位的 3 种数据和分析趋势
  20. python 矩阵拼接_Numpy基础4 矩阵取整 拉平 拼接 切分 复制等函数操作

热门文章

  1. Speech两种使用方法
  2. 计算广告 | 互联网广告的商业模式(1)
  3. php cms h5,PHPCMS html5/h5自适应金融科技咨询通用网站模板网站带整站源码
  4. 小猪的Python学习之旅 —— 15.浅尝Python数据分析
  5. cBioPortal 数据库
  6. 过河卒问题(java实现)
  7. 常用对称加密算法之AES算法-CBC模式
  8. 判断点与多边形的关系(1):向量积法
  9. react17同源iframe父子页面相互调用方法
  10. 2021-2027全球与中国硬件在环测试市场现状及未来发展趋势