如果我有這個代碼與一個解鎖套接字有關,稱為sockrecv_data = sock.recv(1024) if recv_data: data.outb += recv_data else: print('closing connection to', data.addr) sel.unregister(sock) sock.close()究竟發(fā)生了什么?該語句與阻止和非阻止有何不同?如果程序不等待該語句完成,那么怎么會有價值呢?recv_data = sock.recv(1024)recv_data編輯:完整的服務器代碼:import selectorsimport socketimport typeshost = "127.0.0.1"port = 65432def accept_wrapper(sock): conn, addr = sock.accept() print('accepted conneciton from', addr) conn.setblocking(False) data = types.SimpleNamespace(addr=addr, inb=b'', outb=b'') events = selectors.EVENT_READ | selectors.EVENT_WRITE sel.register(conn, events, data=data)def service_connection(key, mask): sock = key.fileobj data = key.data if mask & selectors.EVENT_READ: recv_data = sock.recv(1024) if recv_data: data.outb += recv_data else: print('closing connection to', data.addr) sel.unregister(sock) sock.close() if mask & selectors.EVENT_WRITE: if data.outb: print('echoing', repr(data.outb), 'to', data.addr) sent = sock.send(data.outb) data.outb = data.outb[sent:]sel = selectors.DefaultSelector()lsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)lsock.bind((host, port))lsock.listen()print('listening on', (host, port))lsock.setblocking(False)sel.register(lsock, selectors.EVENT_READ, data=None)while True: events = sel.select(timeout=None) for key, mask in events: if key.data is None: # From the listening socket accept_wrapper(key.fileobj) else: # Client Socket service_connection(key, mask)
1 回答

呼啦一陣風
TA貢獻1802條經(jīng)驗 獲得超6個贊
如果 是非阻塞的,則如果它以其他方式阻塞,它將引發(fā)。代碼周圍是否有 / 未顯示?另一個選項用于確保在調(diào)用 之前讀取要接收的數(shù)據(jù)。sockBlockingIOErrortryexceptselect.selectrecv
假設相應服務器的示例:
>>> from socket import *
>>> s=socket()
>>> s.connect(('localhost',5000))
>>> s.setblocking(0)
>>> s.recv(1024)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
BlockingIOError: [WinError 10035] A non-blocking socket operation could not be completed immediately
編輯:
使用附加代碼,僅在報告(數(shù)據(jù)準備讀取)時調(diào)用,因此不應阻塞。它將返回數(shù)據(jù)或空字符串。后者表示套接字已關閉。recvsel.selectEVENT_READrecv
添加回答
舉報
0/150
提交
取消