gpt4 book ai didi

python - Python 中的非阻塞套接字?

转载 作者:太空狗 更新时间:2023-10-29 21:40:57 25 4
gpt4 key购买 nike

是我吗,还是我找不到关于 python 中非阻塞套接字的好教程?

我不确定如何准确处理其中的 .recv.send。根据 python 文档,(至少我对此的理解)recvsend 的数据可能只是部分数据。那么这是否意味着我必须在 recv 时以某种方式连接数据并确保所有数据都在 send 中发送。如果是这样,如何?一个例子将不胜感激。

最佳答案

你的socket是否处于非阻塞模式并不重要,recv/send的工作几乎是一样的;唯一的区别是非阻塞套接字抛出“资源暂时不可用”错误,而不是等待数据/套接字。

recv 方法返回接收到的字节数,它被告知小于或等于传递的 bufsize。如果您想接收恰好 size 个字节,您应该执行类似于以下代码的操作:

def recvall(sock, size):
data = ''
while len(data) < size:
d = sock.recv(size - len(data))
if not d:
# Connection closed by remote host, do what best for you
return None
data += d
return data

记住这一点很重要,在阻塞模式下你必须做同样的事情。 (传递给应用层的字节数例如受操作系统中接收缓冲区大小的限制。)

send 方法返回发送的字节数,它被告知小于或等于传递的字符串的长度。如果要确保发送了整条消息,您应该执行类似于以下代码的操作:

def sendall(sock, data):
while data:
sent = sock.send(data)
data = data[sent:]

您可以直接使用 sock.sendall,但是(根据文档)出错时会引发异常,并且无法确定成功发送了多少数据(如果有的话) .

Python 中的套接字遵循 BSD 套接字 API,其行为方式与 c 风格套接字类似(不同之处在于,例如,它们抛出异常而不是返回错误代码)。您应该对网络上的任何套接字教程和联机帮助页感到满意。

关于python - Python 中的非阻塞套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6715944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com