Python通过套接字发送文件

时间:2015-06-12 16:03:09

标签: python sockets

我正在尝试编写一个脚本,该脚本需要将文件从服务器发送到客户端,并且当目标不是本地主机时,文件被完全发送时出现问题。因此,当服务器和客户端在不同的机器上时,客户端似乎更快地接收文件,然后服务器发送它并停止提前接收。例如,如果我尝试通过客户端发送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

非常感谢任何帮助。

1 个答案:

答案 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