在python中发送/接收文件UDP
作者:互联网
我做了这个发送/接收脚本,但我损坏了文件!
我不明白为什么我会遇到这个问题!
sender.py
#!/usr/bin/env python
from socket import *
import sys
s = socket(AF_INET,SOCK_DGRAM)
host =sys.argv[1]
port = 9999
buf =1024
addr = (host,port)
file_name=sys.argv[2]
f=open(file_name,"rb")
data = f.read(buf)
s.sendto(file_name,addr)
s.sendto(data,addr)
while (data):
if(s.sendto(data,addr)):
print "sending ..."
data = f.read(buf)
s.close()
f.close()
receiver.py
#!/usr/bin/env python
from socket import *
import sys
import select
host="0.0.0.0"
port = 9999
s = socket(AF_INET,SOCK_DGRAM)
s.bind((host,port))
addr = (host,port)
buf=1024
data,addr = s.recvfrom(buf)
print "Received File:",data.strip()
f = open(data.strip(),'wb')
data,addr = s.recvfrom(buf)
try:
while(data):
f.write(data)
s.settimeout(2)
data,addr = s.recvfrom(buf)
except timeout:
f.close()
s.close()
print "File Downloaded"
这是我修改它的原始接收器(工作正常100%)
#!/usr/bin/env python
from socket import *
import sys
import select
host="0.0.0.0"
port = 9999
s = socket(AF_INET,SOCK_DGRAM)
s.bind((host,port))
addr = (host,port)
buf=1024
f = open("file.pdf",'wb')
data,addr = s.recvfrom(buf)
try:
while(data):
f.write(data)
s.settimeout(2)
data,addr = s.recvfrom(buf)
except timeout:
f.close()
s.close()
print "File Donwloaded"
因为你注意到它正在开始制作文件.
付出:
client =>发送文件(name.ext)=> server:保存它(name.ext)
我的输出:
pdf文件损坏,txt为空
解决方法:
你的代码有问题:
>当数据通过套接字发送时,通常较低层将合并来自多个sendTo调用的数据并将它们一起发送以减少网络负载.
>您将两次发送文件的前1024个字节.
你应该做什么:
使用某种带有几个字符的分隔符字符串(如“** _ $$”),这样它就不会存在于实际的文件二进制表示中.然后将此分隔符附加到文件名的末尾.
在启动while循环之前再次从文件读取.
在接收器端,将所有内容接收到单个流中,然后使用分隔符进行拆分.您将拥有文件名和文件数据.
更新:
工作代码(Ubuntu / Windows XP)
# ----- sender.py ------
#!/usr/bin/env python
from socket import *
import sys
s = socket(AF_INET,SOCK_DGRAM)
host =sys.argv[1]
port = 9999
buf =1024
addr = (host,port)
file_name=sys.argv[2]
s.sendto(file_name,addr)
f=open(file_name,"rb")
data = f.read(buf)
while (data):
if(s.sendto(data,addr)):
print "sending ..."
data = f.read(buf)
s.close()
f.close()
# ----- receiver.py -----
#!/usr/bin/env python
from socket import *
import sys
import select
host="0.0.0.0"
port = 9999
s = socket(AF_INET,SOCK_DGRAM)
s.bind((host,port))
addr = (host,port)
buf=1024
data,addr = s.recvfrom(buf)
print "Received File:",data.strip()
f = open(data.strip(),'wb')
data,addr = s.recvfrom(buf)
try:
while(data):
f.write(data)
s.settimeout(2)
data,addr = s.recvfrom(buf)
except timeout:
f.close()
s.close()
print "File Downloaded"
用法
>> python recevier.py
>> python sender.py localhost filename.txt
标签:sender,python,sockets,file-transfer,udp 来源: https://codeday.me/bug/20191005/1855008.html