非阻塞IO

服务端
from socket import *
import time
server = socket(AF_INET,SOCK_STREAM)
server.bind(('127.0.0.1',8081))
server.listen(3)
server.setblocking(False)      #accept变为非阻塞状态,
print('server startting...')
conn_l = []       #存放原始数据
del_l = []     #存放错误的数据
while True:               #链接循环
    try:
        print('=====>',conn_l)    #链接地址
        conn,addr = server.accept()    #如果没有异常处理立马抛出错误    conn是链接,可以收发消息
        # print(addr)
        conn_l.append(conn)
    except BlockingIOError:   #收不到数据干这里的
        time.sleep(4)   #休眠两秒,继续
        for conn in conn_l:    #再次循环列表中的conn
            try:
                data = conn.recv(1024)
                conn.send(data.upper())
            except BlockingIOError:
                pass
            except ConnectionResetError:
                del_l.append(conn)  #错误的conn添加到del_l
        for obj in del_l:
            obj.close()      #和conn.close   一样,只是换了个名字
            conn_l.remove(obj)       #将那个错误的obj直接从元列表删除
        del_l = []            #清空列表    清空之后下次还可以接收,删除了就没地方存放他的值
        continue
#新建一个存放错误值的列表,然后


客户端
from socket import *
client = socket(AF_INET,SOCK_STREAM)
client.connect(('127.0.0.1',8081))
while True:
    msg = input('p;ease:').strip()
    if not msg:continue
    client.send(msg.encode('utf-8'))
    data = client.recv(1024)
    print(data.decode('utf-8'))

  

posted @ 2017-09-01 18:49 前方、有光 阅读(...) 评论(...) 编辑 收藏