簡體   English   中英

Python通過套接字發送文件

[英]Python sending a file over 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

任何幫助將不勝感激。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM