是我,还是我找不到关于Python中非阻塞套接字的好教程?
我不确定如何准确地工作.recv
和.send
在里面。根据 python 文档,(至少是我的理解)recv
'ed or send
'ed 数据可能只是部分数据。那么这是否意味着我必须以某种方式连接数据recv
并确保所有数据都通过send
。如果是这样,怎么办?一个例子将不胜感激。
你的套接字是否处于非阻塞模式并不重要,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 风格套接字类似(不同之处在于,例如,它们抛出异常而不是返回错误代码)。您应该对网络和联机帮助页上的任何套接字教程感到满意。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)