如何在套接字编程中接收一定数量的数据?

时间:2013-07-07 02:29:54

标签: python sockets

我正在编写一个函数来从套接字读取并返回确切的数据大小。我想到的代码如下:

whlie len(buf) < required:
    buf += socket.recv(required - len(buf))

return buf

但我认为这可能会浪费一些CPU资源(不确定)。我正在寻找系统调用或从套接字返回确切数据量的东西,它可以被阻止,直到收到所需的大小。

3 个答案:

答案 0 :(得分:1)

这不会浪费CPU资源。

sock.recvblock直到至少有一个字节可用(但如果可用,则可以缓冲并返回多个字节),因此您的应用程序不会进入繁忙循环。

一般来说,sock.recv来电should not have anything to do with the length of the message you'd like to retrieve的缓冲区长度。


字符串连接对您的缓冲区效率不高。

您可能需要考虑使用:

  • 列表,''.join()b''.join(),如果使用Python 3)
  • StringIOcStringIO模块(如果使用Python 3,则为io.BytesIO。)
  • 使用sock.recv_intoStringIO / 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,请不要忘记它。