第二十三篇、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第二个参数用于读写分离

原文地址:https://www.cnblogs.com/pyrene/p/6431711.html