PYTHON__关于Socket中的Select使用理解
生活随笔
收集整理的這篇文章主要介紹了
PYTHON__关于Socket中的Select使用理解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
關于Socket中的Select使用理解
以下是代碼和中文注釋的個人理解
import socket, select, Queueserver=('192.168.2.100',10086)#創建TCP/TP Socket sock_ser=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #設置不阻塞監聽 sock_ser.setblocking(False) sock_ser.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #綁定IP地址 sock_ser.bind(server) #監聽連接 sock_ser.listen(10)#準備用來讀取數據的Socket,客戶端向服務端的讀端口寫 incomes=[sock_ser] #準備用來寫的Socket,客戶端從寫Socket讀 outputs=[]""" 寫出消息的隊列,由于select是循環機制,所以每個獨立的outputs都需要一個隊列來保存待寫出的數據, 等到輪回到自己的時候寫出 """ msg_que={}#超時時間。 timeout=20#服務端的Socket用來接受服務端的連接,并用作與循環。 while incomes:"""先等待至少一個Socket的數據處理,Select返回當前三個列表。這三個數據來自于可讀,可寫,返回的錯誤。Select監聽并等待網絡活動。如果有網絡活動則開始執行"""rs,ws,es=select.select(incomes,outputs,incomes,timeout)if not(rs or ws or es):print "error: timeout...."breakfor s in rs:"""此處的rs存儲很多Socket,開始存儲只有服務端本身的Socket,用于與客戶端建立新的連接。并將客戶端建立好的連接存儲在incomes中,incomes會返回給rs。存儲的的客戶端,會被用于收發數據。"""#rs隊列中按個讀取,如果是服務端的socket就用那個與建立新的連接。if s is sock_ser:conn,addr=s.accept()print "connect by ",addrconn.setblocking(False)incomes.append(conn)#為接入的客戶端提供一個隊列來發送回復給客戶端的數據msg_que[conn]=Queue.Queue()#如果不是服務端的socket,是客戶端建立連接的Socket,就收數據,并判斷是否斷開。else:data=s.recv(1024)#有數據就收數據if data:print "receive client ",datamsg_que[s].put(data)if s not in outputs:outputs.append(s)#可讀的socket沒有數據發送,則說明客戶端斷開連接,我們刪除這個客戶端。else:if s in outputs:outputs.remove(s)incomes.remove(s)s.close()del msg_que[s]#寫操作,查看隊列里面是否有東西,并發送到對應的Socket.for s in ws:try:msg = msg_que[s].get_nowait()except Queue.Empty:#因為是輪回的,當前面連接斷開后,寫的socket尚未刪除,這一步還是要執行的,所以最后輸出了幾個EMPTY。print 'msg empty'outputs.remove(s)else:s.send("from server :"+msg)for s in es:print "except",s.getpeername()if s in incomes:incomes.remove(s)if s in outputs:outputs.remove(s)s.close()del msg_que[s]
轉載于:https://www.cnblogs.com/freeideas/archive/2013/04/29/3050255.html
總結
以上是生活随笔為你收集整理的PYTHON__关于Socket中的Select使用理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浦发信用卡优惠活动之五一家电大作战:京东
- 下一篇: C#基础之如何判断两个文件内容是否相同