day9 IO多路复用
参考:http://www.cnblogs.com/wupeiqi/articles/5040823.html
SocketServer内部使用 IO多路复用 以及 “多线程” 和 “多进程” ,从而实现并发处理多个客户端请求的Socket服务端。即:每个客户端请求连接到服务器时,Socket服务端都会在服务器是创建一个“线程”或者“进程” 专门负责处理当前客户端的所有请求。
IO多路复用server端:
import socket import select # IO多路复用:8002,8001 # ############################### 基于select实现服务端的“伪”并发 ############################### sk1 = socket.socket() sk1.bind(('127.0.0.1',8001,)) sk1.listen(5) sk2 = socket.socket() sk2.bind(('127.0.0.1',8002,)) sk2.listen(5) inputs = [sk1,sk2,] w_inputs = [] while True: # IO多路复用,同时监听多个socket对象 # - select,内部进行循环操作(1024) 主动查看 # - poll, 内部进行循环操作 主动查看 # - epoll, 被动告知 r,w,e = select.select(inputs,w_inputs,inputs,0.05) # r = [sk2,] # r = [sk1,] # r = [sk1,sk2] # r = [] # r = [conn,] # r = [sk1,Wconn] #######? for obj in r: if obj in [sk1,sk2]: # 新连接捡来了... print('新连接来了:',obj) conn,addr = obj.accept() inputs.append(conn) else: # 有连接用户发送消息来了.. print('有用户发送数据了:',obj) try: data = obj.recv(1024) except Exception as ex: data = "" if data: w_inputs.append(obj) # obj.sendall(data) else: obj.close() inputs.remove(obj) w_inputs.remove(obj) for obj in w: obj.sendall(b'ok') w_inputs.remove(obj)
client 端1:
import socket client = socket.socket() client.connect(('127.0.0.1',8001,)) while True: v = input('>>>') client.sendall(bytes(v,encoding='utf-8')) ret = client.recv(1024) print('服务器返回:',ret)
client 端2:
import socket client = socket.socket() client.connect(('127.0.0.1',8002,)) while True: v = input('>>>') client.sendall(bytes(v,encoding='utf-8')) ret = client.recv(1024) print('服务器返回:',ret)