2013-07-07 28 views
0

我正在写一个函数来读取套接字并返回确切的数据大小。我想到的代码如:如何在套接字编程中接收一定数量的数据?

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

return buf 

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

回答

0

这不会浪费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模块(或io.BytesIO如果使用Python 3):

    你可能要考虑使用。

  • 使用sock.recv_intoStringIO/bytesIO
+0

感谢您的注意,我实际上使用'bytearray'类型,http://dabeaz.blogspot.com/2010/01/few-useful-bytearray-tricks.html –

+0

'StringIO'和''''出你想要['io.BytesIO'](http://docs.python.org/dev/library/io.html#io.BytesIO)或'b'''。 – phihag

+0

@phihag谢谢!我一直在Python 3中得到一点点! :) –

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

+1

这可能不总是奏效:'num_bytes'是您要读取的最大字节数,但可能会返回比您期望的更少的字节。 –

相关问题