select 并发 多路复用IO

#服务端
import socket
import select, queue


server = socket.socket()
server.bind(("127.0.0.1", 8999))
server.listen(1000)
inputs = [server,]#建立的连接
outputs = []#输出的连接
msg_dic = {}#存储连接队列的字典
while True:
    readable, writeable, exceptional = select.select(inputs, outputs, inputs)
    for r in readable:
        if r is server:#如果是新建立的连接则实例化
            conn,addr = server.accept()
            print("建立了新的连接",addr)
            msg_dic[conn] = queue.Queue()#把此连接的队列存储到字典里
            inputs.append(conn)
        else:
            data = r.recv(1024).decode()#不是新建立的连接,则接收数据
            msg_dic[r].put(data)#把接收的数据存入队列中
            outputs.append(r)#把此连接加入到待发送列表
            # print(r)
            # r.send(data.upper().encode("utf-8"))

    for w in writeable:#接收发送相互独立
        data = msg_dic[w].get()#从队列中取出数据
        w.send(data.upper().encode("utf-8"))#发送数据
        outputs.remove(w)#在待发送列表中中删除此连接
        
    for e in exceptional:#如果连接断开
        inputs.remove(e)#在已建立的列表中删除此连接
        outputs.remove(e)#在待发送列表中删除此连接
        del msg_dic[e]#删除此连接的队列

#客户端
from socket import *

client=socket(AF_INET,SOCK_STREAM)
client.connect(('127.0.0.1',8999))


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()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值