应用程序 发送给 操作系统内核 ,如果没有数据就返回
那么我就干其他的事情,遇到IO操作就切换,干一会在回来问问,有数据没有,没有在切换,干其它的事情
#阻塞
server.setblocking(False)
#服务器
取出一个个conn来收消息 for conn in rlist:
循环去除要删除的数据 for conn in del_rlist:
有链接,就加到rlist里面 ,如果没有新的链接进来,就出异常了,就执行except BlockingIOError下的,循环rlist,收到数据就send下,如果收不到数据就抛异常continue:可能会有下一个消息来呢,期间抛异常加入到del_rlist里面去,执行删除操作
一直处于工作状态,运行状态,没有阻塞
#客户端
服务端就有1个线程,自己检测IO切换
#服务端下的 这两个都是IO操作
accept
recv
发成功加到删除里面去 del_wlist.append(item)
这样会有两个问题
一、如果干其它活 过程当中,有没有数据来了,有可能 ,能及时相应这个数据吗?不能
问题: 非阻塞IO 不能及时相应数据
二、服务端没有任何阻塞 ,其实就是死循环。这个线程一直处于就绪状态,尽可能多的给你cpu,大量做无用的询问 ,每过一会就问,每过一会就问。导致cpu非常多,
所有 非阻塞IO模型绝不被推荐
from socket import *
server = socket(AF_INET, SOCK_STREAM)
server.bind(('127.0.0.1',8083))
server.listen(5)
server.setblocking(False)
print('starting.....')
rlist = []
wlist = []
while True:
try:
conn,addr = server.accept()
rlist.append(conn)
print(rlist)
except BlockingIOError:
#收消息
del_rlist = []
for conn in rlist:
try:
data = conn.recv(1024)
if not data:
del_rlist.append(conn)
continue
#存放准备要发的数据
wlist.append((conn,data.upper()))
except BlockingIOError:
continue
except Exception:
conn.close()
del_rlist.append(conn)
#发消息
del_wlist=[]
for item in wlist:
try:
conn=item[0]
data=item[1]
conn.send(data)
del_wlist.append(item)
except BlockingIOError:
pass
for item in del_wlist:
wlist.remove(item)
for conn in del_rlist:
rlist.remonve(conn)
server.close()
from socket import *
client = socket(AF_INET, SOCK_STREAM)
client.connect(('127.0.0.1',8083))
while True:
msg=input('>>>: ').strip()
if not msg:continue
# 发完消息
client.send(msg.encode('utf-8'))
# 收消息
data = client.recv(1024)
print(data.decode('utf-8'))
client.close()