我正在编写一个函数来从套接字读取并返回确切的数据大小。我想到的代码如下:
whlie len(buf) < required:
buf += socket.recv(required - len(buf))
return buf
但我认为这可能会浪费一些CPU资源(不确定)。我正在寻找系统调用或从套接字返回确切数据量的东西,它可以被阻止,直到收到所需的大小。
答案 0 :(得分:1)
这不会浪费CPU资源。
sock.recv
将block直到至少有一个字节可用(但如果可用,则可以缓冲并返回多个字节),因此您的应用程序不会进入繁忙循环。
一般来说,sock.recv
来电should not have anything to do with the length of the message you'd like to retrieve的缓冲区长度。
字符串连接对您的缓冲区效率不高。
您可能需要考虑使用:
''.join()
(b''.join()
,如果使用Python 3)StringIO
和cStringIO
模块(如果使用Python 3,则为io.BytesIO
。)sock.recv_into
和StringIO
/ bytesIO
。 答案 1 :(得分:0)
如果您使用的是默认套接字库,则可以使用以下内容。
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 documentation
答案 2 :(得分:0)
请参阅我的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
,请不要忘记它。