day18
今天学习内容:
- io多路复用--select
在win下 : io多路复用就是使用底层的select去进行对io句柄的监控
通过select 可以进行server 和client 的句柄进行监控,当发生读写时,可以动态去处理。
example:
#!/usr/bin/env python
#-*- encoding:utf-8 -*-
import select
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',9999))
sk.listen()
inp = [sk]
inps = []
oups = []
msg_dict = {}
inpp = []
while True:
#参数1 是监控socket句柄列表,一旦服务端/客户端句柄发生动作则处理
#参数2 如果存在句柄,则会对句柄进行一个处理,譬如当读取到数据,则将客户端的链接添加到inps,在下一个循环中去处理接受到的数据
#参数3 是当发生socket错误时,该参数接收到发生错误的句柄
#参数4 指定io的一个循环等待时间,这里时最多1秒
r,w,e = select.select(inp,inps,inp,1)
for s in r:
#如果是服务端接受链接则添加到inp的监听队列
if s == sk:
conn,address = s.accept()
inp.append(conn)
msg_dict[conn]=[]
else:
try:
msg_dict[s].append(str(s.recv(1024),encoding='utf-8'))
inps.append(s)
except Exception as ex:
print(ex)
inp.remove(s)
for s1 in w:
print(msg_dict[s1][0])
ret = msg_dict[s1][0]+'好'
del msg_dict[s1][0]
s1.sendall(bytes(ret,encoding='utf-8'))
inps.remove(s1)
for s2 in e:
inp.remove(s2)
- 还有socketserver源码分析
- ftp作业讲解