【问题标题】:Python sending a file over socketsPython 通过套接字发送文件
【发布时间】:2015-08-28 17:25:34
【问题描述】:

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

任何帮助将不胜感激。

【问题讨论】:

    标签: python sockets


    【解决方案1】:

    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
    

    【讨论】:

      猜你喜欢
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      • 2012-03-12
      • 2011-02-24
      • 2019-08-12
      • 2015-07-10
      相关资源
      最近更新 更多