在使用socket進行網絡通信時,可以設置socket為阻塞或非阻塞模式。
阻塞模式下,當執行socket的讀取和寫入操作時,如果沒有數據可讀或無法立即寫入數據,當前線程會被阻塞,直到有數據可讀或可以寫入數據。
非阻塞模式下,當執行socket的讀取和寫入操作時,如果沒有數據可讀或無法立即寫入數據,當前線程不會被阻塞,而是立即返回一個錯誤碼,然后可以通過不斷地輪詢socket狀態來判斷是否有數據可讀或可以寫入數據。
要設置socket為非阻塞模式,可以使用socket.setblocking(False)
方法來實現。該方法接受一個布爾值參數,設置為False表示將socket設置為非阻塞模式。要設置回阻塞模式,可以使用socket.setblocking(True)
。
下面是一個簡單的示例代碼,演示如何設置socket為非阻塞模式:
import socket
# 創建一個TCP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 將socket設置為非阻塞模式
sock.setblocking(False)
# 連接到服務器
sock.connect(('www.example.com', 80))
# 發送數據
sock.send('GET / HTTP/1.1\r\nHost: www.example.com\r\n\r\n')
# 接收數據
data = ''
while True:
try:
chunk = sock.recv(1024)
if not chunk:
break
data += chunk
except socket.error:
pass
# 關閉socket
sock.close()
# 打印接收到的數據
print(data)
在這個示例中,通過sock.setblocking(False)
將socket設置為非阻塞模式,然后在接收數據時通過捕獲socket.error異常來處理非阻塞模式下的錯誤碼。