基于select的网络IO模型

0x01 server

import select
import socket

sk = socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen()
del_l = []
rlist = [sk]# 是用来让select帮忙监听的 所有 接口
# select:windows/linux是监听事件有没有数据到来
# poll:  linux   也可以做select的工作
# epoll: linux   也可以做类似的工作
while 1:
    r,w,x = select.select(rlist,[],[])# 传参给select,当rlist列表中哪个接口有反应,就返回给r这个列表
    if r:
        for i in r:# 循环遍历r,看看有反应的接口到底是sk  还是conn
            if i == sk:
                # 如果是sk,那就表示有客户端的连接请求
                '''sk有数据要接收,代表着有客户端要来连接'''
                conn,addr = i.accept()
                rlist.append(conn)# 把新的客户端的连接,添加到rlist,继续让select帮忙监听
            else:
                # 如果是conn,就表示有客户端给我发数据了
                '''conn有数据要接收,代表要使用recv'''
                try:
                    msg_r = i.recv(1024).decode('utf-8')
                    if not msg_r:
                        '''客户端执行了close,客户端主动正常关闭连接'''
                        del_l.append(i)
                        i.close()
                    else:
                        print(msg_r)
                        i.send(msg_r.upper().encode('utf-8'))
                except ConnectionResetError:
                    pass
        if del_l:# 删除那些主动断开连接的客户端的conn
            for conn in del_l:
                rlist.remove(conn)
            del_l.clear()

0x02 Client

import socket
sk = socket.socket()
sk.connect(('127.0.0.1',8080))

while 1:
    msg_s = input('>>>')
    if not msg_s:continue
    if msg_s == 'q':break
    sk.send(msg_s.encode('utf-8'))
    print(sk.recv(1024).decode('utf-8'))
sk.close()

0x03

比较常用的网络IO模型, 深入的话推荐异步IO

原文链接: 基于select的网络IO模型 版权所有,转载时请注明出处,违者必究。
注明出处格式:流沙 ( https://gyarmy.com/post-643.html )

发表评论

0则评论给“基于select的网络IO模型”