python select方法的使用
服务端
1 import socket
2 import select #同步io
3 sock = socket.socket()
4 sock.bind(("127.0.0.1",8000))
5 sock.listen(5)
6 sock.setblocking(False) #非阻塞链接(False)
7 inputs = [sock,]
8 while True:
9 a, b, c = select.select(inputs, [], []) #监控(sock连接以及收发内核态存储的数据)
10 for obj in a:
11 if obj == sock:
12 conn, addr = obj.accept()
13 inputs.append(conn)
14 print(conn)
15
16 else:
17 while True: # 通信循环,
18 #解决有多个client端同时连接,若其中一个捣蛋关闭己端连接,那么对端跟着被中断
19 try:
20 data = obj.recv(1024)
21 print(data.decode('utf-8'))
22 send_data = input(">>>")
23 if len(send_data) == 0: break
24 obj.send(send_data.encode('utf-8'))
25
26 except Exception as e:
27 break
#select()的都是基于单线程的并发操作(非阻塞的socket连接)
#select()方法接收并监控3个通信列表, 第一个是所有的输入的data,就是指外部发过来的数据,
# 第2个是监控和接收所有要发出去的data(outgoing data),
# 第3个监控错误信息,接下来我们需要创建2个列表来包含输入和输出信息来传给select().
#监控客户端发来的连接跟 监听io的读写
客户端
1 import socket
2 sock = socket.socket()
3 sock.connect(("127.0.0.1",8000))
4 while True:
5 send_data = input(">>>")
6 sock.send(send_data.encode('utf-8'))
7 recv_data = sock.recv(1024)
8 print(recv_data.decode('utf-8'))