关于python:Python-网络编程当内核读缓冲区为空调用-socket-的-recv-的会发生什么

6次阅读

共计 1110 个字符,预计需要花费 3 分钟才能阅读完成。

阻塞 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
正文完
 0