python建立socket中的select
时间: 2023-12-15 09:07:00 浏览: 30
在 Python 中,使用 `select` 模块可以实现对多个 socket 连接的同时监听,从而实现高效的网络编程。
下面是一个基本的使用 `select` 的例子:
```python
import select
import socket
# 创建 TCP socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setblocking(False)
# 绑定 IP 和端口
server_address = ('localhost', 10000)
server.bind(server_address)
# 启动监听
server.listen(5)
# 创建 epoll 对象
epoll = select.epoll()
# 注册 server socket 到 epoll 中
epoll.register(server.fileno(), select.EPOLLIN)
# 事件循环
while True:
# 等待 epoll 事件
events = epoll.poll()
# 遍历事件
for fileno, event in events:
# 如果是 server socket 有新连接到来
if fileno == server.fileno():
connection, client_address = server.accept()
connection.setblocking(False)
epoll.register(connection.fileno(), select.EPOLLIN)
# 如果是已连接的 socket 有数据到达
elif event & select.EPOLLIN:
data = connection.recv(1024)
if data:
print(f'Received data: {data.decode()}')
else:
epoll.unregister(fileno)
connection.close()
```
上述代码中,我们首先创建了一个 TCP socket,然后将其绑定到指定的 IP 和端口,并启动监听。接下来,我们创建了一个 epoll 对象,并将 server socket 注册到 epoll 中。然后进入事件循环,等待 epoll 事件,如果是 server socket 有新连接到来,我们就接受连接,并将新连接的 socket 也注册到 epoll 中。如果是已连接的 socket 有数据到达,我们就接收数据并处理。如果数据为空,说明连接已关闭,我们就将该 socket 从 epoll 中注销,并关闭该连接。
需要注意的是,在使用 `select` 和 `epoll` 时,需要确保所有 socket 都是非阻塞的,否则会阻塞整个程序。在上述代码中,我们通过 `setblocking(False)` 方法将 server socket 和连接 socket 都设置为非阻塞的。