套接字 - 缓冲数据

时间:2015-07-16 15:10:29

标签: python sockets

我从第三方api中提取数据,我只想了解socket.recv(bufsize)

这是一个片段:

def readlines(sock, recv_buffer=4096, delim='\n'):
    buffer = ''
    data = True
    while data:
        data = sock.recv(recv_buffer)
        buffer += str(data.decode('latin-1'))

        while buffer.find(delim) != -1:
            line, buffer = buffer.split('\n', 1)
            yield line
    return

def main():
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((host, port))
    sock.sendall(request_message.encode())
    for line in readlines(sock):
        # do some stuff

一切正常,我只是试图准确理解缓冲区的具体情况。以下哪一项正在发生?

  • 我使用request_message请求数据。服务器一次性将所有内容发送给我,我一次只能读取4096字节?
  • 或者我向服务器发送多个请求,实际上一次要求4096字节?

我认为这是第一个选择,但我只是想更好地检查和理解它。

此外,在请求数据时是否必须使用缓冲区?

1 个答案:

答案 0 :(得分:1)

TCP和UDP无法“请求”数据。这可以在应用程序协议中完成,但套接字函数对此没有任何了解。他们只是处理原始数据。

因此服务器会在任何时候发送数据。您指定的缓冲区大小是recv将一次处理的最大值,但它可能返回小于此值。在数据报(UDP)套接字的情况下,它返回每次调用一个数据报的内容。在流(TCP)套接字的情况下,它返回到目前为止已经收到的任何内容,直到极限。