Python 網路程式設計:當核心讀緩衝區為空,呼叫 socket 的 recv 的會發生什麼?

ponponon發表於2022-02-06

阻塞 socket

阻塞 socket 呼叫 recv 獲取不到資料:

  • 如果沒有設定超時時間,這永遠阻塞直到有資料
  • 如果設定了超時時間,在規定時間內沒有收到資料,這丟擲 TimeoutError 異常,該異常為 Python 自帶異常,不依賴第三方,也不只需要導包,直接用就可以

設定超時方式:

import socket

clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect(('127.0.0.1', 8080))

clientsocket.settimeout(3.0)
data = clientsocket.recv(2024)
clientsocket.close()
data.decode()

結果如下:

Traceback (most recent call last):
  File "/home/bot/Desktop/coder/ideaboom/test_socket/main.py", line 7, in <module>
    data = clientsocket.recv(2024)
TimeoutError: timed out

參考文章:
tcp 緩衝區滿的問題
如何在 python 的 socket recv 方法上設定超時?

非阻塞 socket

非阻塞 socket 呼叫 recv 獲取不到資料:

  • 立即返回錯誤:BlockingIOError: [Errno 11] Resource temporarily unavailable,其中的 BlockingIOError 為 Python 內建異常,不需要導包和依賴第三方

例項:

import socket  # 客戶端 傳送一個資料,再接收一個資料
from socket import socket as Socket


clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

clientsocket.connect(('127.0.0.1', 8080))
clientsocket.setblocking(False)

data = clientsocket.recv(2024)

clientsocket.close()

結果如下:

Traceback (most recent call last):
  File "/home/bot/Desktop/coder/ideaboom/test_socket/main.py", line 10, in <module>
    data = clientsocket.recv(2024)
BlockingIOError: [Errno 11] Resource temporarily unavailable

相關文章