socket.recv() 收到的字节少于预期
socket.recv() receives less bytes than expected
这段代码下载了大部分文件但不是所有文件(在 while 循环内)知道我做错了什么吗?
data = csocket.recv(1024)
with open(filename, 'wb') as file_to_save:
while data:
file_to_save.write(data)
time.sleep(.008)
data = csocket.recv(1024)
if len(data) < 1024:
break
当下载 38,616 字节大小的文件时,此代码大约下载了 600 字节。
通常情况下,recv() 函数不保证 return 您 "request" 的总字节数。该参数只是您希望接收的最大字节数,但如果缓冲区中可用,则该函数可以比此少 return 个字节。这是 https://docs.python.org/3/howto/sockets.html
的实现
def myreceive(self):
chunks = []
bytes_recd = 0
while bytes_recd < MSGLEN:
chunk = self.sock.recv(min(MSGLEN - bytes_recd, 2048))
if chunk == b'':
raise RuntimeError("socket connection broken")
chunks.append(chunk)
bytes_recd = bytes_recd + len(chunk)
return b''.join(chunks)
如您所见,该函数会重复 recv() 直到预期的字节数到达。每个块到达后,新的 recv() 请求最大字节数 MSGLEN – bytes_recd
。 min() 用于限制每个块的接收字节数为 2048。当 recv() 函数 returns 0 字节(chunk == b'')时,表示对方关闭了连接。
对于你的情况,len(data)
可以 return 有时 return 小于 1024。你的中断条件应该是 if len(data) < 1:
这段代码下载了大部分文件但不是所有文件(在 while 循环内)知道我做错了什么吗?
data = csocket.recv(1024)
with open(filename, 'wb') as file_to_save:
while data:
file_to_save.write(data)
time.sleep(.008)
data = csocket.recv(1024)
if len(data) < 1024:
break
当下载 38,616 字节大小的文件时,此代码大约下载了 600 字节。
通常情况下,recv() 函数不保证 return 您 "request" 的总字节数。该参数只是您希望接收的最大字节数,但如果缓冲区中可用,则该函数可以比此少 return 个字节。这是 https://docs.python.org/3/howto/sockets.html
的实现 def myreceive(self):
chunks = []
bytes_recd = 0
while bytes_recd < MSGLEN:
chunk = self.sock.recv(min(MSGLEN - bytes_recd, 2048))
if chunk == b'':
raise RuntimeError("socket connection broken")
chunks.append(chunk)
bytes_recd = bytes_recd + len(chunk)
return b''.join(chunks)
如您所见,该函数会重复 recv() 直到预期的字节数到达。每个块到达后,新的 recv() 请求最大字节数 MSGLEN – bytes_recd
。 min() 用于限制每个块的接收字节数为 2048。当 recv() 函数 returns 0 字节(chunk == b'')时,表示对方关闭了连接。
对于你的情况,len(data)
可以 return 有时 return 小于 1024。你的中断条件应该是 if len(data) < 1: