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"))
原文地址:https://www.cnblogs.com/tingguoguoyo/p/10999888.html