select是一个io多路复用的io模型,也叫做事件驱动的io模型,我们今天用select来实现一个多并发的socket的聊天的程序
先看下server端的代码
import socket import select socket_list = [] socket_list_all = [] def create_socket(): for i in range(9000,9100): socket_name = "socket_" + str(i) socket_name = socket.socket() addr = ("127.0.0.1",i) socket_name.bind(addr) socket_name.listen(10) socket_list.append(socket_name) #负责存放所有的socket服务端的对象 socket_list_all.append(socket_name) #负责存储所有的socket服务端和客户端的socket对象 #生成100个socket对象 socket_list_temp = socket_list if __name__ == '__main__': create_socket() while True: r,w,e = select.select(socket_list_all,[],[]) #监听socket列表 for obj in r: if obj in socket_list: conn,addr = obj.accept() socket_list_all.append(conn) break #如果在socket_list,在说明是一个新的连接过来连接socketserver else: #如果不是,则说明是已有的连接 client_data = obj.recv(1024) print(obj, str(client_data, encoding="utf-8"), sep=">>>>") server_data = input("server:") obj.sendall(bytes(server_data, encoding="utf-8"))
在来看客户端的代码
import socket ip_bind = ("127.0.0.1",9000) client1= socket.socket() client1.connect(ip_bind) while True: clent_data = input("client:") client1.sendall(bytes(clent_data,encoding="utf-8")) server_data = client1.recv(1024) print("server",str(server_data,encoding="utf-8"))