在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
進行處理,對于監聽套接字,表示有新的連接;對于其他套接字,表示有數據可讀。