我正在尝试编写一个脚本,该脚本需要将文件从服务器发送到客户端,并且当目标不是本地主机时,文件被完全发送时出现问题。因此,当服务器和客户端在不同的机器上时,客户端似乎更快地接收文件,然后服务器发送它并停止提前接收。例如,如果我尝试通过客户端发送200 MB文件,则通常会在大约180 MB左右接收它。
以下是发送和接收文件的脚本部分。
发送文件
def t_handle(client, address, s):
file_size = str(os.stat("path to file to send").st_size)
print file_size
client.send(file_size)
work_file = open("path to fil to send", "rb")
print "sending file"
file_size = int(file_size)
while file_size > 0:
buffer = work_file.read(1024)
client.send(buffer)
file_size -= 1024
print file_size
print "done"
接收档案
def main():
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.settimeout(90)
server.connect((host, port))
file_size = int(server.recv(1024))
print "receiving file"
file_size = int(file_size)
print file_size
f = open("test_output.mkv", "wb+")
while file_size > 0:
work_file = server.recv(1024)
f.write(work_file)
file_size -= 1024
print file_size
f.close()
print "done"
return 0
非常感谢任何帮助。
答案 0 :(得分:3)
socket.recv()
的参数是调用将返回的最大字节数,并且无法保证在任何给定的调用中实际上都会得到那么多:
while file_size > 0:
work_file = server.recv(1024)
f.write(work_file)
file_size -= 1024
print file_size
如果每次调用时收到的字节数少于1024个字节,但从目标字节数减去那么多字节,则代码将在实际完成之前完成。
尝试将其修改为:
while file_size > 0:
work_file = server.recv(1024)
f.write(work_file)
# subtract the actual number of bytes received
file_size -= len(work_file)
print file_size