gpt4 book ai didi

python - 在 python 中发送/接收文件 UDP

转载 作者:行者123 更新时间:2023-11-28 20:25:46 24 4
gpt4 key购买 nike

我已经制作了这个发送/接收脚本,但我损坏了文件!我不知道为什么我会遇到这个问题!

发件人

#!/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()

接收器.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"

如您所见,它在开始时正在制作文件。

精确的:客户端=>发送文件(name.ext)=>服务器:保存它(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

关于python - 在 python 中发送/接收文件 UDP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13993514/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com