Python:在计算机之间发送大文件
我正在尝试在公司网络中从一台电脑发送一个大约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
然后通过网页浏览器从客户端访问。这会显示本地文件夹。