在Socket编程中,select()
是一个用于多路复用的函数,用于监视套接字集合的状态变化。它可以同时监视多个套接字,一旦其中任何一个套接字变得可读、可写或发生错误,select()
就会返回,告诉程序该套接字的状态发生了变化。
select()
函数的基本用法如下:
import select
# 创建套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((host, port))
sock.listen(5)
# 创建套接字集合
sockets_list = [sock]
read_sockets, write_sockets, error_sockets = select.select(sockets_list, [], [])
# 处理可读的套接字
for sock in read_sockets:
# 如果是监听套接字,则表示有新的连接
if sock == server_socket:
client_socket, client_address = server_socket.accept()
sockets_list.append(client_socket)
print('New connection from {}'.format(client_address))
# 否则,表示有数据可读
else:
data = sock.recv(1024)
if data:
print('Received data: {}'.format(data))
else:
# 如果没有接收到数据,则表示连接已关闭
print('Connection closed')
sockets_list.remove(sock)
在上面的代码中,select()
函数监视了 sockets_list
中的套接字,一旦其中任何一个套接字变得可读,select()
函数就会返回。然后程序可以通过遍历 read_sockets
进行处理,对于监听套接字,表示有新的连接;对于其他套接字,表示有数据可读。