IO多路复用

IO 多路复用

什么是 IO 多路复用呢,其当我们看到这么一个词,可能会感觉很高大上,其实IO多路复用,结合上篇文章的 socket 来说,就是一个相当于会监控活跃的客户端,而不就是说会采用遍历的机制去一个一个询问客户端,其实IO多路复用有三种技术,分别是 Epoll、 Select、Poll

那么我们要将的就是Epoll,是 Linux 下的一种 IO多路复用,那么应该怎么样和我们的了互动和服务器结合起来,那么直接上代码吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import selectors  # 导入包
import socket

# 生成 ePoll 选择器
ePollSelect = selectors.EpollSelector()

server = socket.socket()
server.bind(('', 9000))
server.listen(1000)
print('开始监听...')


def read(conn):
data = conn.recv(1000)
if data:
print(data.decode())
conn.send(data)
else:
# 取消注册事件
ePollSelect.unregister(conn)


def accept(s):
connection, remote_address = s.accept()
print("========客户端{}已经连接".format(remote_address))
ePollSelect.register(connection, selectors.EVENT_READ, read)


# 注册事件
ePollSelect.register(server, selectors.EVENT_READ, accept)

# 事件循环
while True:
# 获取所有事件
ev = ePollSelect.select()
for key, _ in ev:
key.data(key.fileobj)

客户端代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import socket

# 生成客户端socket
client = socket.socket()
# 向服务端发起连接
client.connect(('127.0.0.1', 9000))
# 循环发送和接收
while True:
msg = input('>>')
client.send(msg.encode())
data = client.recv(1000)
print('服务端返回的数据{}'.format(data.decode()))

import socket

# 生成客户端socket
client = socket.socket()
# 向服务端发起连接
client.connect(('127.0.0.1', 9000))
# 循环发送和接收
while True:
msg = input('>>')
client.send(msg.encode())
data = client.recv(1000)
print('服务端返回的数据{}'.format(data.decode()))

---------------- The   End ----------------