#此程序用来设置非阻塞IO,并在阻塞时每隔两秒打印当前时间
from socket import *
from time import sleep,ctime
s = socket()
s.bind(('0.0.0.0',8888))
s.listen(3)
#将套接字设置为非阻塞
s.setblocking(False)
while True:
print('Waiting for connect...')
try:
c,addr = s.accept()
#处理非阻塞异常:每隔两秒打印当前时间
except BlockingIOError:
sleep(2)
print(ctime())
continue
else:
print("Connect from",addr)
while True:
data = c.recv(1024).decode()
if not data:
break
print(data)
c.send(ctime().encode())
c.close()
设置超时时间的非阻塞IO
#此程序用来设置非阻塞IO,并设置5秒超时时间
#在阻塞时每隔两秒打印当前时间
from socket import *
from time import sleep,ctime
s = socket()
s.bind(('127.0.0.1',8888))
s.listen(3)
#将套接字设置为非阻塞
s.setblocking(False)
#给套接字设置超时时间
#超时会发成timeout异常
s.settimeout(5)
while True:
print('Waiting for connect...')
try:
c,addr = s.accept()
#处理非阻塞异常:每等待5秒超时时间后执行其他代码或产生异常
#此处为每两秒打印当前时间
except timeout:
sleep(2)
print(ctime())
continue
else:
print("Connect from",addr)
while True:
data = c.recv(1024).decode()
if not data:
break
print(data)
c.send(ctime().encode())
c.close()
#此程序演示select处理IO多路复用,可以连接多个客户端
from select import select
from socket import *
s = socket()
s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
s.bind(('0.0.0.0',8888))
s.listen(5)
rlist = [s]
wlist = []
xlist = []
#循环检测并处理三个列表中的IO事件
while True:
#监听是否有IO事件发生
rs,ws,xs = select(rlist,wlist,xlist)
for r in rs:
if r is s:
c,addr = s.accept()
print("Connecting from:",addr)
rs.append(c)
else:
data = r.recv(1024).decode()
if not data:
rs.remove(r)
r.close()
else:
print("receive the info:",data)
#将客户端套接字放入wlist关注列表
wlist.append(r)
for w in rs:
'''
wlist中的元素相当于向服务端发送信息的客户端
'''
send_msg = 'receive yout info'
w.send(send_msg.encode())
wlist.remove(w)
for x in xs:
pass