Python:在计算机之间发送大文件

2 投票
1 回答
2348 浏览
提问于 2025-04-18 17:00

我正在尝试在公司网络中从一台电脑发送一个大约340 MB的文件到另一台电脑。

发送完成后,另一台电脑只收到了大约325 MB。
大约有15 MB的文件丢失了。

我在192.169.0.5这台电脑上运行我的客户端脚本。

python3 client.py

然后我在192.168.0.4这台电脑上运行我的服务器脚本。

python3 server.py 192.168.0.5 test.sql

我的服务器源代码是:

s = socket(AF_INET,SOCK_DGRAM)
host = sys.argv[1]
port = 9999
buf = 4096
addr = (host,port)

s.connect((host , port))


file_name=sys.argv[2]

f=open(file_name,"rb")
data = f.read(buf)
print('Sending file '+ file_name +' ...')

sent_size = 0

while True:
    if(s.send(data)):

        sent_size += buf
        mb = round(sent_size / 1024 / 1024, 2)
        sys.stdout.write("\rSent: "+ str(mb) +" MB")
        sys.stdout.flush()

        time.sleep(0.001)
        data = f.read(buf)

    else:
        print('\n- Finished')
        s.close()
        break

我的客户端源代码是:

host="0.0.0.0"
port = 9999
s = socket(AF_INET,SOCK_DGRAM)
s.bind((host,port))

addr = (host,port)
buf=4096



while True:

    data,addr = s.recvfrom(buf)

    if data:

        data,addr = s.recvfrom(buf)
        b2 = 0

        f = open("recv/received.deb",'wb')

        while(data):
            f.write(data)
            s.settimeout(2)
            b2 += buf
            mb = round(b2 / 1024 / 1024, 2)
            sys.stdout.write("\rReceived: "+ str(mb) +" MB")
            sys.stdout.flush()
            data,addr = s.recvfrom(buf)

        break

对于小文件(大约1MB),一切都能正常工作,但如果我们想发送更大的文件(300MB),就会出现数据包丢失的问题。
我该如何解决这个问题呢?

1 个回答

1

从你的代码来看,你正在使用UDP的套接字。你应该使用 SOCK_STREAM

s = socket(AF_INET,SOCK_STREAM)
host = sys.argv[1]
port = 9999
buf = 4096
addr = (host,port)

所以,你需要修改这两个脚本来发送文件。对于本地网络,我推荐使用简单的方法:

python3 -m http.server

然后通过网页浏览器从客户端访问。这会显示本地文件夹。

撰写回答