IO模型 ---非阻塞IO模型之socket/TCP规避IO操作(二)

server 端

import socket
sk = socket.socket()
sk.bind(('127.0.0.1',9000))
sk.setblocking(False) 设置阻塞,为false时是非阻塞
sk.listen()
conn_l = []
del_conn = []
while True:
try:
conn,addr = sk.accept() #不阻塞,但是没人连我会报错
print('建立连接了:',addr)
conn_l.append(conn)
except BlockingIOError:
for con in conn_l:
try:
msg = con.recv(1024) # 非阻塞,如果没有数据就报错,client端睡1秒时server会报错
if msg == b'': #当客户端断开或未发送消息时,recv会一直得到的是一个b' '空消息
del_conn.append(con)
continue
print(msg)
con.send(b'byebye')
except BlockingIOError:pass
for con in del_conn:
con.close()
conn_l.remove(con)
del_conn.clear()
当不明白执行步骤就断点,双击打断点,然后右键debug‘server’

# while True : 10000 500 501

client 端

import time
import socket
import threading
def func():
sk = socket.socket()
sk.connect(('127.0.0.1',9000))
sk.send(b'hello')
time.sleep(1)
print(sk.recv(1024))
sk.close()

for i in range(2):
threading.Thread(target=func).start()

while true会大量消耗内存,所以非阻塞IO并不是那么完美,便出现了下节内容的多路复用IO

原文地址:https://www.cnblogs.com/mys6/p/10913968.html