python的io多路复用_Python select实现I/O多路复用和读写分离

下面的实例代码演示了使用 select 模拟多线程并实现读/写分离的过程。

1)看文件 fenliser.py 是否实现了服务器端的功能。具体实现代码如下。

#使用socket模拟多线程,让多用户可以同时连接

import socket

import select

sk1 = socket.socket()

sk1.bind(('0.0.0.0', 8000))

sk1.listen()

inputs = [sk1, ]

outputs = []

message_dict = {}

while True:

r_list, w_list, e_list = select.select(inputs, outputs, inputs, 1)

print('正在监听的socket对象%d' % len(inputs))

print(r_list)

for sk1_or_conn in r_list:

#每一个连接对象

if sk1_or_conn == sk1:

#表示有新用户要连接

conn, address = sk1_or_conn.accept()

inputs.append(conn)

message_dict[conn] = []

else:

#有老用户发消息了

try:

data_bytes = sk1_or_conn.recv(1024)

except Exception as ex:

#如果用户终止连接

inputs.remove(sk1_or_conn)

else:

data_str = str(data_bytes, encoding='utf-8')

message_dict[sk1_or_conn].append(data_str)

outputs.append(sk1_or_conn)

#w_list中仅保存了给我发送过消息的人

for conn in w_list:

recv_str = message_dict[conn][0]

del message_dict[conn][0]

conn.sendall(bytes(recv_str+'好', encoding='utf-8'))

outputs.remove(conn)

for sk in e_list:

inputs.remove(sk)

2)看文件 fenlicli.py 是否实现了客户端的功能。具体实现代码如下。

import socket

obj = socket.socket()

obj.connect(('127.0.0.1', 8000))

while True:

inp = input('>>>')

obj.sendall(bytes(inp, encoding='utf-8'))

ret = str(obj.recv(1024),encoding='utf-8')

print(ret)

obj.close()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值