Ham*_*daq 2 python sockets udp file-transfer 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()
Run Code Online (Sandbox Code Playgroud)
接收器.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"
Run Code Online (Sandbox Code Playgroud)
这是我修改过的原始接收器(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"
Run Code Online (Sandbox Code Playgroud)
正如您所注意到的,它在一开始就创建文件。
精确:客户端=>发送文件(name.ext)=>服务器:保存它(name.ext)
我的输出:pdf 文件损坏,txt 文件为空
这里有两个问题:
您正在使用一个from socket import *
. 它本身并不是一个错误,但当你这样做时,它就变成了一个错误except socket.timeout
。
使用 UDP,腐败就不足为奇了。您可能不想在这里使用 UDP,您应该切换到 TCP。
以下是 UDP 不适合的原因:
请注意,切换到 TCP 将涉及对代码进行一些重构(这比仅替换为更复杂一些SOCK_DGRAM
)SOCK_STREAM
,但就您而言,您必须这样做。
我并不是说 UDP 不好,但它不适合你的情况。
您的代码的问题:
你应该做什么:
使用某种具有几个字符的分隔符字符串(如“**_$$”),这样它就不会存在于实际的文件二进制表示中。然后将此分隔符附加到文件名的末尾。
在开始 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()
Run Code Online (Sandbox Code Playgroud)
# ----- 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"
Run Code Online (Sandbox Code Playgroud)
用法
>> python recevier.py
Run Code Online (Sandbox Code Playgroud)
>> python sender.py localhost filename.txt
Run Code Online (Sandbox Code Playgroud)