PythonStudy——非阻塞IO模型
服务端
import socket import time import select server = socket.socket() server.bind(("127.0.0.1",1688)) server.listen(5) # server.setblocking(False) # 默认为阻塞 设置为False 表示非阻塞 """ 参数1 rlist 里面存储需要被检测是否可读(是否可以执行recv)的socket对象 参数2 wlist 里面存储需要被检测是否可写(是否可以执行send)的socket对象 参数3 xlist 存储你需要关注异常条件 忽略即可 参数4 timeout 检测超时时间 一段时间后还是没有可以被处理的socket 那就返回空列表 返回值: 三个列表 1 已经有数据到达的socket对象 2 可以发送数据的socket对象 怎么可以发 缓冲区没有满 3 忽略.... """ rlist = [server,] wlist = [] # 要发送的数据和socket msgs = [] while True: ras,was,_ = select.select(rlist,wlist,[]) # 阻塞直到socket可读或是可写 # 处理可读的socket for s in ras: if s == server: client,addr = server.accept() rlist.append(client) else: try: # 收数据 data = s.recv(2048) if not data: raise ConnectionResetError() wlist.append(s) # s.send(data.upper()) # 将要发送的数据和socket 保存起来 msgs.append((s,data)) except ConnectionResetError: s.close() rlist.remove(s) if s in wlist:wlist.remove(s) # 处理可写的socket for s in was: for msg in msgs[:]: if msg[0] == s: s.send(msg[1].upper()) # 发送成功之后 删除已经无用的数据 并且需要将socket从wlist列表中删除 # 不删除会造成死循环 因为socket 一直处于可写状态 msgs.remove(msg) wlist.remove(s)
客户端
import os import socket client = socket.socket() client.connect(("127.0.0.1",1688)) while True: msg = input("msg:") if not msg:continue client.send(msg.encode("utf-8")) print(client.recv(2048).decode("utf-8"))