python - seletors实现IO多路复用
2024-10-20 20:43:50
服务端
from socket import *
import selectors
sel = selectors.DefaultSelector()
def accept(server_fileobj, mask):
conn, addr = server_fileobj.accept()
sel.register(conn, selectors.EVENT_READ, read)
def read(conn, mask):
try:
data = conn.recv(1024)
if not data:
print('closing', conn)
sel.unregister(conn)
conn.close()
return
conn.send(data.upper() + b'_SB')
except Exception:
print('closing', conn)
sel.unregister(conn)
conn.close()
server_fileobj = socket(AF_INET, SOCK_STREAM)
server_fileobj.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
server_fileobj.bind(('127.0.0.1', 8088))
server_fileobj.listen(5)
server_fileobj.setblocking(False) # 设置socket的接口为非阻塞
sel.register(server_fileobj, selectors.EVENT_READ, accept) # 相当于往select的读列表里append了一个文件句柄
# server_fileobj,并且绑定了一个回调函数accept
while True:
events = sel.select() # 检测所有的fileobj,是否有完成wait data的
for sel_obj, mask in events:
callback = sel_obj.data # callback=accpet
callback(sel_obj.fileobj, mask) # accpet(server_fileobj,1)
客户端
from socket import *
c=socket(AF_INET,SOCK_STREAM)
c.connect(('127.0.0.1',8088))
while True:
msg=input('>>: ')
if not msg:continue
c.send(msg.encode('utf-8'))
data=c.recv(1024)
print(data.decode('utf-8'))
最新文章
- clear属性
- 使用ASP.NET MVC、Rabbit WeixinSDK和Azure快速开发部署微信后台
- php openssl 增加密钥
- busybox filesystem udhcpc 原理
- HTML5学习(九)----应用程序缓存
- ActiveX控件打包成Cab置于网页中自动下载安装(转载)
- JavaScript之引用类型介绍
- WINCE 电池状态(C#)
- 继续几道经典的js题(局部和全局变量,对象等)
- Docker - docker machine
- LeetCode解题中位运算的运用
- DataContractJsonSerializer序列化时间类型时转换为UTC溢出问题
- 第十一节:WebApi的版本管理的几种方式
- 第十五节: EF的CodeFirst模式通过DataAnnotations修改默认协定
- Python基础-Python的三元运算符和lambda表达式
- Confluence 6 字符集编码的问题解决
- 20180429 xlVBA套打单据自适应列宽
- linux问题解答
- PHP构造函数的重载
- 文档的js