我正在编写一个函数来从套接字读取并返回数据的确切大小。我想到了如下代码:
whlie len(buf) < required:
buf += socket.recv(required - len(buf))
return buf
但我认为这可能会浪费一些 CPU 资源(不确定)。我正在寻找一个系统调用或其他东西来从套接字返回确切的数据量,并且它可能会被阻止,直到收到所需的大小。
这不会浪费 CPU 资源。
sock.recv
将阻塞直到至少有一个字节可用(但如果它们可用,可能会缓冲并返回多个字节),因此您的应用程序不会进入繁忙循环。
一般来说,sock.recv
调用的缓冲区长度不应该与您要检索的消息的长度有任何关系。
但是,字符串连接对您的缓冲区效率不高。
您可能需要考虑使用:
''.join()
(b''.join()
如果使用 Python 3)StringIO
andcStringIO
模块(或者如果使用io.BytesIO
Python 3)。sock.recv_into
和StringIO
/ bytesIO
。如果您使用的是默认套接字库,则可以使用以下内容。
import socket
host, port = "localhost", 8000
num_bytes = 5000
sock = socket.socket()
sock.connect((host, port))
while True:
data = sock.recv(num_bytes)
handle(data)
您可以在这里查看可能的参数socket.recv 文档
请参阅我的 Python 2.x 套接字模块示例。使用memoryview()
和recv_into()
,
def readReliably(s,n):
buf = bytearray(n)
view = memoryview(buf)
sz = s.recv_into(view,n)
return sz,buf
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
...
sz,buf = io.readReliably(s,4)
a = struct.unpack("4B",buf)
print repr(a)
返回的缓冲区的大小readReliably()
可以大于n
,不要忘记。