Python網絡編程之帶select的異步IO

與之前的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掉以多次接受數據


發佈了36 篇原創文章 · 獲贊 47 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章