與之前的socket方式不同,select通過輪流詢問的方式監聽(讀取)客戶端
select也存在阻塞,會等待到三個描述符至少一個準備就緒.
select函數參數爲三個列表 分別爲 r_list,w_list,e_list分別代表輸入,輸出,異常列表
返回參數也是這三個列表
實現方式如下
import select
import socket
s=socket.socket()
host=socket.gethostname()
port=1234
s.bind((host,port))
s.listen(5)
inputs=[s,]
outputs=[]
while True:
r_list,w_list,e_list=select.select(inputs,outputs,inputs,1)
for i in r_list:
if i is s:
c,addr=s.accept()
inputs.append(c)
print(str(addr)+"has been connected")
else:
try:
date=i.recv(1024)
print(str(i.getpeername))
print(date.decode())
outputs.appned(i)
except Exception as ex:
#inputs.remove(i)
pass
for t in w_list:
outputs.remove(t)
for g in e_list:
inputs.remove(g)
對上述程序進行解釋:
前幾排就是進行一些常規的網絡配置
死循環中select帶入列表並設置超時爲1s
先遍歷r_list如果是自身套接字則創建新的連接,並將新的連接
如果是inputs列表中的其他套接字則表示有數據傳輸過來,獲取數據並打印
e_list中的都是有異常的套接字,視爲斷開連接,刪除掉
值得注意的是:當客戶端停止發送,程序會進行異常捕捉並視爲斷開連接,這裏我pass掉以多次接受數據