h小游戏在线玩,花都天气,友基漫影1000l
python中的select模块专注于i/o多路复用,提供了select poll epoll三个方法(其中后两个在linux中可用,windows仅支持select),另外也提供了kqueue方法(freebsd系统)
r_list,w_list,e_list = select.select(rlist, wlist, xlist, [timeout])
三个参数
示例:
服务端
import socket import time import select s = socket.socket() s.bind(("127.0.0.1",1688)) # 设置为非阻塞 模型 s.setblocking(true) #在多路复用中 阻塞与非阻塞没有区别 因为select会阻塞直到有数据到达为止 s.listen(5) # 待检测是否可读的列表 r_list = [s] # 待检测是否可写的列表 w_list = [] # 待发送的数据 msgs = {} print("开始检测了") while true: read_ables, write_ables, _= select.select(r_list,w_list,[]) print("检测出结果了!") # print(read_ables,"可以收数据了") # print(write_ables,"可以发数据了") # 处理可读 也就是接收数据的 for obj in read_ables: # 拿出所有可以读数据的socket #有可能是服务器 有可能是客户端 if s == obj: # 服务器 print("来了一个客户端 要连接") client,addr = s.accept() r_list.append(client) # 新的客户端也交给select检测了 else:# 如果是客户端则执行recv 接收数据 print("客户端发来一个数据") data = obj.recv(1024) print("有个客户端说:",data) # 将要发送数据的socket加入到列表中让select检测 w_list.append(obj) # 将要发送的数据已经socket对象丢到容器中 if obj in msgs: # 由于容器是一个列表 所以需要先判断是否已经存在了列表 msgs[obj].append(data) else: msgs[obj] = [data] # 处理可写的 也就是send发送数据 for obj in write_ables: msg_list = msgs.get(obj) if msg_list: # 遍历发送所有数据 for m in msg_list: obj.send(m.upper()) # 数据从容器中删除 msgs.pop(obj) # 将这个socket从w_list中删除 w_list.remove(obj)
客户端
import socket c = socket.socket() c.connect(("127.0.0.1",1688)) while true: msg = input("").strip() if not msg:continue c.send(msg.encode("utf-8")) print(c.recv(1024).decode('utf-8'))
后续几种方法以后总结补充
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Python 实现将numpy中的nan和inf,nan替换成对应的均值
python爬虫把url链接编码成gbk2312格式过程解析
网友评论