多路复用IO的select使用

select基础使用方法

########################################客户端
from socket import *client=socket(AF_INET,SOCK_STREAM)
client.connect(('10.11.190.147',8080))while True:msg=input('>>: ').strip()if not msg:continueclient.send(msg.encode('utf-8'))data=client.recv(1024)print(data.decode('utf-8'))client.close()
###########################################服务端
import select
import socket
sk=socket.socket()
sk.bind(('10.11.185.130',8080))
sk.listen(5)while True:r,w,e=select.select([sk,],[],[])#select时会发生阻塞,直到套接字的状态发生变化#如果不想阻塞,可以在最后再添加一个数字参数,如select。select.([sk,],[],[],5)表示非阻塞,每5秒监听一次#select会监听第一个列表里的套接字,如果套接字状态变成readable则会把对应的套接字放入r列表中  #当socket连接到新的链接,或者conn的收和发生消息时,他们的状态都会变成readable print(r) for obj in r: conn,addr=obj.accept() #如果socket不accept或者conn不recv,则他们会一直处于readable状态 data=conn.recv(1024) print(data) conn.send(data.upper())

完整客户端/服务端

###########################################服务端
import select
import socket
sk=socket.socket()
sk.bind(('10.11.190.147',8080))
sk.listen(5)
inputs=[sk,]#将需要监听的套接字放进inputs列表里
while True:r,w,e=select.select(inputs,[],[])for obj in r:if obj==sk:conn,addr=obj.accept()print('connect',conn,'from',addr)conn.setblocking(0)     #将套接字设为非阻塞inputs.append(conn)     #将套接字放入监听列表中else:try:data=obj.recv(1024)if data:print('message',data,'from',obj.getpeername())conn.send(data.upper())else: #如果接受为空则关闭链接print('close connect %s',obj.getpeername())obj.close()inputs.remove(obj)  #移除套接字except Exception as e:  #如果发生错误,则关闭链接print('Error',e)print('close connect',obj.getpeername())obj.close()inputs.remove(obj)  #移除套接字
########################################客户端
from socket import *client=socket(AF_INET,SOCK_STREAM)
client.connect(('10.11.190.147',8080))while True:msg=input('>>: ').strip()if not msg:continueclient.send(msg.encode('utf-8'))data=client.recv(1024)print(data.decode('utf-8'))client.close()

除了Select可以实现IO多路复用,还有poll和epoll模块可以实现,它们的不同点是:

Select最多可以监听1024个连接,且管理多个描述符也是进行轮询,根据描述符的状态进行处理,但select在linux,windows,mac上都有

poll解决select的监听个数限制,但是依旧是轮询方式。

epoll解决了轮询问题,可以直接拿到就绪的套接字,但是Windows不支持。

好在我们有selectors模块,帮我们默认选择当前平台下最合适的

Selectors

############################################################服务端
import selectors
import socket
sel=selectors.DefaultSelector()#设置不同平台默认的selectoer
sk=socket.socket()
sk.bind(('10.11.190.147',8080))
sk.setblocking(0)
sk.listen(5)def accpet(obj,mask):print('mask is',mask)conn,addr=obj.accept()print('connect',conn,'from',addr)conn.setblocking(0)sel.register(conn,selectors.EVENT_READ,read) #将套接字放入监听列表,并绑定read函数def read(obj,mask):print('mask is',mask)try:data=obj.recv(1024)if data:print('message:',data,'from',obj.getpeername())message=input('>>:').strip()obj.send(message.encode('utf8'))else:print('close connect:',obj.getpeername())sel.unregister(obj)  #将套接字从监听列表中移除,不再监听obj.close()except Exception as e:print(e)print('close connect:',obj.getpeername())sel.unregister(obj)obj.close()sel.register(sk,selectors.EVENT_READ,accpet)#监听套接字sk,并绑定函数accept
while True:events=sel.select() #开始监听for obj,mask in events:callable=obj.data #获得套接字绑定的函数,如果是sk,则callback=acceptcallable(obj.fileobj,mask)  #执行绑定的函数,obj.fileobj就是拿到的套接字,如果是sk,相当于accpet(sk,mask)
########################################客户端
from socket import *client=socket(AF_INET,SOCK_STREAM)
client.connect(('10.11.190.147',8080))while True:msg=input('>>: ').strip()if not msg:continueclient.send(msg.encode('utf-8'))data=client.recv(1024)print(data.decode('utf-8'))client.close()

Select与Selectors相关推荐

  1. python中select用法_Python select及selectors模块概念用法详解

    1. select模块 针对select,要先理解其他几个概念: 文件描述符: 文件描述符在形式上是一个非负整数.实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表.当程序打开 ...

  2. 【经典】5种IO模型 | IO多路复用

    上篇回顾:静态服务器+压测 3.2.概念篇 1.同步与异步 同步是指一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成. 异步是指不需要等待被依赖的任务完成,只是通 ...

  3. CSS3表单设计–复古

    CSS3 Form Design – Vintage Today I prepared great CSS3 styles for forms in vintage style. You can se ...

  4. python123第五周作业答案_python第五十四天--第十周作业

    SELECT版FTP: 使用SELECT或SELECTORS模块实现并发简单版FTP 允许多用户并发上传下载文件 必须使用select or selectors模块支持多并发,禁止使用多线程或多进程 ...

  5. python开发题库-进阶(持续更新2020-3-18)

    文章目录 1.网络相关 01 IP地址的正则 03 三次握手四次挥手全过程 为什么握手不是三次或者两次 04 使用python打开百度页面 05 进程 线程 协程 06 IO多路复用 07 TCP和U ...

  6. python取整的几种方法,Python中取整的几种方法小结

    Python中取整的几种方法小结 前言 对每位程序员来说,在编程过程中数据处理是不可避免的,很多时候都需要根据需求把获取到的数据进行处理,取整则是最基本的数据处理.取整的方式则包括向下取整.四舍五入. ...

  7. python(40)- 进程、线程、协程及IO模型

    一.操作系统概念 操作系统位于底层硬件与应用软件之间的一层.工作方式:向下管理硬件,向上提供接口. 操作系统进行进程切换:1.出现IO操作:2.固定时间. 固定时间很短,人感受不到.每一个应用层运行起 ...

  8. jeee的基础知识(转载)

    Servlet: 1)servlet : servlet是一个特殊的java程序,需要在web服务器上运行,并接收和响应客户端的请求,遵循http协议. 2)Servlet;作用: 主要用于控制层. ...

  9. ORACLE-SQL较全面笔记

    -- 首先,以超级管理员的身份登录oracle        sqlplus sys/bjsxt as sysdba        --然后,解除对scott用户的锁        alter use ...

最新文章

  1. JVM学习笔记之-类加载子系统,类的加载与类的加载过程,双亲委派机制
  2. 让机器读懂视频:亿级淘宝视频背后的多模态AI算法揭秘
  3. Fiddler设置抓一个域名下个包
  4. at java.net.url init,java.net 基本测试
  5. aes key长度_AES加密(1): 基本AES算法
  6. ajax 2分钟超时_ajax和axios、fetch的区别
  7. 图片上传预览 (URL.createObjectURL)
  8. 解决请求筛选模块被配置为拒绝包含的查询字符串过长的请求
  9. Nordic-nRF52840环境搭建及学习
  10. MATLABs函数构建增量式PI控制器(文末有仿真模型及C代码)
  11. 设置mac锁屏但不关闭网络
  12. Excel不能自动求和的可能原因
  13. JavaEE | 集合之HashMap与ConcurrentHashMap(看完多线程后补充)
  14. Spring的事件处理
  15. Java曲线之削峰填谷,科学网—Lorenz曲线之削峰填谷 - 李宁的博文
  16. 苹果cms采集接口配置教程
  17. python3 模块调用其他类的方法_python类的函数调用 python如何引用其他模块中类的方法中的变量?...
  18. 小程序转uni-app——动态转换样式
  19. IDEA 2018.3.6 修改背景图片
  20. 南京大学软件学院 西交计算机,2021届薪酬最高的十大本科专业,前三名都是计算机和相关专业...

热门文章

  1. 法国Navya无人驾驶巴士正式开始测试,并计划明年出售450辆
  2. HUAWEI DevEco Testing注入攻击测试:以攻为守,守护OpenHarmony终端安全
  3. 红包php源码,生成微信红包
  4. 上海区块链技术研发_上海区块链工程技术研究中心于复旦大学正式揭牌
  5. 打印小册子(一张A4纸4页内容)步骤分享
  6. 【论文泛读】XFlow: Cross-Modal Deep Neural Networks for Audiovisual Classification
  7. Android 高德地图显示国外地图,安卓地图只显示高德地图四个字
  8. 蓝桥杯客观题 单片机知识点总结
  9. android 自动隐藏输入法,Android隐藏输入法
  10. linux模块移植到freertos,FATFS在嵌入式操作系统FreeRTOS中的移植与应用