標籤:selectors append add als localhost 一個 調用 pre obj
模組使用樣本1
import selectorsimport socketsel = selectors.DefaultSelector()def accept(sock, mask): conn, addr = sock.accept() # Should be ready 建立串連 print(‘accepted‘, conn, ‘from‘, addr) conn.setblocking(False) sel.register(conn, selectors.EVENT_READ, read)#註冊到時間迴圈列表(不立刻收,用戶端可能還沒有發。)如果再有活動就調用read函數def read(conn, mask): data = conn.recv(1000) # Should be ready if data: print(‘echoing‘, repr(data), ‘to‘, conn) conn.send(data) # Hope it won‘t block else: print(‘closing‘, conn) sel.unregister(conn) conn.close()sock = socket.socket()sock.bind((‘localhost‘, 1234))sock.listen(100)sock.setblocking(False)sel.register(sock, selectors.EVENT_READ, accept)#先註冊server對象。調用acceptwhile True: events = sel.select() #預設阻塞,有活動連結就返回活動列表 for key, mask in events: callback = key.data callback(key.fileobj, mask)
使用樣本2
#服務端from socket import *import selectorssel=selectors.DefaultSelector()def accept(server_fileobj,mask): conn,addr=server_fileobj.accept() sel.register(conn,selectors.EVENT_READ,read)def read(conn,mask): try: data=conn.recv(1024) if not data: print(‘closing‘,conn) sel.unregister(conn) conn.close() return conn.send(data.upper()+b‘_SB‘) except Exception: print(‘closing‘, conn) sel.unregister(conn) conn.close()server_fileobj=socket(AF_INET,SOCK_STREAM)server_fileobj.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)server_fileobj.bind((‘127.0.0.1‘,8088))server_fileobj.listen(5)server_fileobj.setblocking(False) #設定socket的介面為非阻塞sel.register(server_fileobj,selectors.EVENT_READ,accept) #相當於網select的讀列表裡append了一個檔案控制代碼server_fileobj,並且綁定了一個回呼函數acceptwhile True: events=sel.select() #檢測所有的fileobj,是否有完成wait data的 for sel_obj,mask in events: callback=sel_obj.data #callback=accpet callback(sel_obj.fileobj,mask) #accpet(server_fileobj,1)#用戶端from socket import *c=socket(AF_INET,SOCK_STREAM)c.connect((‘127.0.0.1‘,8088))while True: msg=input(‘>>: ‘) if not msg:continue c.send(msg.encode(‘utf-8‘)) data=c.recv(1024) print(data.decode(‘utf-8‘))
python selectors 模組應用