我从第三方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
一切正常,我只是试图准确理解缓冲区的具体情况。以下哪一项正在发生?
我认为这是第一个选择,但我只是想更好地检查和理解它。
此外,在请求数据时是否必须使用缓冲区?
答案 0 :(得分:1)
TCP和UDP无法“请求”数据。这可以在应用程序协议中完成,但套接字函数对此没有任何了解。他们只是处理原始数据。
因此服务器会在任何时候发送数据。您指定的缓冲区大小是recv
将一次处理的最大值,但它可能返回小于此值。在数据报(UDP)套接字的情况下,它返回每次调用一个数据报的内容。在流(TCP)套接字的情况下,它返回到目前为止已经收到的任何内容,直到极限。