Python 多路复用之selectors

  • server端
# I/O多路复用
import selectors
import socket


def accept(sock, mask):
    conn, addr = sock.accept()  # 得到连接对象conn
    conn.setblocking(False)  # 设置为非阻塞
    sel.register(conn, selectors.EVENT_READ, read)  # 把conn对象和对应的read方法注册到sel对象
    print(conn)


def read(conn, mask):
    try:
        msg = conn.recv(1024)
        if msg:
            conn.send(msg)
        else:
            sel.unregister(conn)  # 如果收到的消息为空,注销conn对象,对于linux系统
    except ConnectionResetError as e:
        print(e)
        sel.unregister(conn)  # 连接突然中断,注销conn对象,对于windows系统


sel = selectors.DefaultSelector()  # 创建selectors对象
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 创建socket对象
sock.bind(('127.0.0.1', 8090))
sock.listen(100)
sock.setblocking(False)  # 设置socket对象为非阻塞

sel.register(sock, selectors.EVENT_READ, accept)  # 把sock对象和对应的accept方法注册到sel对象
while True:
    events = sel.select()  # 监听已经注册的对象
    for key, mask in events:
        callback = key.data  # 回调函数
        callback(key.fileobj, mask)  # 调用回调函数
  • client端
import socket

conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
conn.connect(('127.0.0.1', 8090))
while True:
    msg = input('>>>').strip()
    if msg:
        conn.send(msg.encode('utf-8'))
        msg = conn.recv(1024)
        print(msg.decode('utf-8'))

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值