首页 > 编程语言 > 详细

Python——IO多路复用之select模块poll方法

时间:2019-08-01 13:11:40      阅读:64      评论:0      收藏:0      [点我收藏+]

Python——IO多路复用之select模块poll方法

使用poll方法实现IO多路复用

.
├── poll_client.py
├── poll_server.py
└── settings.py

 

# settings.py

HOST = localhost
PORT = 5555
buffersize = 1024
ADDR = HOST, PORT

 

# poll_server.py

from settings import *
from select import *
from socket import *

s = socket()
s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)  # 设置端口可立即重用
s.bind(ADDR)
s.listen()

# 创建poll对象
p = poll()

# 创建地图(字典)
fdmap = {s.fileno(): s}

# 注册关注(事件)
p.register(s, POLLIN | POLLERR)
# POLLIN 对应select方法中的参数rlist         -> 等待处理的IO事件
# POLLOUT 对应select方法中的参数wlist     -> 主动处理的IO事件
# POLLERR 对应select方法中的参数xlist        -> 出错处理的IO事件

while True:
    # 进行IO监控
    # events = [(fileno, event), ...]
    try:
        events = p.poll()
    except KeyboardInterrupt:
        print(KeyboardInterrupt: Ctrl+C to exit)
        break

    for fd, event in events:
        if fd == s.fileno():
            # 从地图中找到fd对应的对象
            conn, addr = fdmap[fd].accept()
            print(Connect from, addr)
            # 注册关注
            p.register(conn, POLLIN)
            # 添加到地图中
            fdmap[conn.fileno()] = conn
        else:
            data = fdmap[fd].recv(buffersize)
            if not data:
                p.unregister(fd)  # 取消注册
                fdmap[fd].close()  # 关闭套接字
                del fdmap[fd]  # 从地图中删除
            else:
                print(fdmap[fd].getpeername(), data.decode())
                fdmap[fd].send(bRoger that!)
s.close()
print(El Fin)        

 

# client.py

from socket import *
from settings import *

s = socket()
s.connect(ADDR)

while True:
    data = input(>> )
    if not data:
        break
    s.send(data.encode())
    print(s.recv(buffersize).decode())

s.close()

 

Python——IO多路复用之select模块poll方法

原文:https://www.cnblogs.com/noonjuan/p/11281767.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!