第二十三篇、IO多路复用 二
基于IO多路复用实现socket的连接
下面流程:
1、先创建列表,让自己的socket对象传入,然后遍历select第一个参数
2、客户端连接,那么客户端socket就传入到了列表里面,
3、遍历,接收客户端信息,并且发送
4、客户端断开,那么就移除掉这个客户端
1 import socket 2 sk = socket.socket() 3 sk.bind(("127.0.0.1",993)) 4 sk.listen() 5 impute = [sk,] 6 import select 7 while True: 9 r_list, w_list, e_list = select.select(impute, [], [], 1) 10 print("正在监听的socket对象%d" % len(impute)) 11 print(r_list) 12 for s in r_list: 13 # 每一个连接对象 14 if s == sk: 15 #新用户连接 16 conn, addres = s.accept() 17 # 这个时候impute列表就包含两个对象1、服务端本身的socket对象2、客户端socket对象(conn是用来和客户端socket对象进行交互的) 18 impute.append(conn) 19 else: 20 try: 21 data_bytes = s.revc(1024) 22 #这里判断,如果用户发消息就发送给客户端消息,否则就移除这个连接 23 data_str = str(data_bytes,encoding="utf-8") 24 s.sendall(bytes(data_str + "好", encoding="utf-8")) 25 except Exception as f: 26 impute.remove(s)
客户端:
#!/usr/bin/env python # -*- coding:utf-8 -*- import socket obj = socket.socket() obj.connect(("127.0.0.1",993)) while True: inp = input(">>>") obj.sendall(bytes(inp,encoding="utf-8")) ret = str(obj.recv(1024),encoding="utf-8") print(ret) obj.close()
这样多个客户端都可以连接,但其实内部还是逐步连接的
select第二个参数用于读写分离