envoyer/recevoir des fichiers UDP en python
J'ai fait cet envoi /réception des scripts, mais je fichier corrompu !
je n'ai aucune idée de pourquoi je me fais de ce problème !
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"
et ce le récepteur d'origine que j'ai modifier (fonctionne très bien 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"
que vous le remarquerez à la prise de fichier au début.
exigé:
client => envoyer un fichier (nom.ext) => serveur:enregistrer (nom.ext)
ma sortie :
corrompu fichier pdf et vide pour txt
- Tout d'abord:
except socket.timeout:
n'est jamais à aller au travail. Vous êtes en train de fairefrom socket import *
, doncsocket
dans votre code est en faitsocket.socket
. Vous devriez faireexcept timeout
ou de l'utilisationimport socket
(fortement recommandée). - je me suis prise.délai d'attente: timed out ,,,, et quand j'envoie le fichier pdf puis de l'ouvrir, il dit que c'est un fichier corrompu , j'ai des connaissances de base sur le protocole UDP, j'ai essayé de faire de mon codé que j'ai dans la question, merci
- merci à vous , vous avez corrigé l'erreur , mais j'ai un autre problème, si j'ai envoyé un fichier de petite taille, il ne s'arrêtera pas (moins de 1028) , mais quand j'ai envoyer des gros fichiers, il fonctionne très bien , je suis réflexion sur la modification de taille de la mémoire tampon
Vous devez vous connecter pour publier un commentaire.
Le problème avec votre code:
Ce que vous devez faire:
Utiliser une sorte de délimiteur de chaîne ayant un couple de caractères (comme "**_$$") afin qu'il ne existe pas dans le fichier binaire de représentation. Puis ajoutez cette délimiteur à la fin du nom de fichier.
Lire à partir du fichier avant de commencer la boucle while.
À l'extrémité du récepteur, de recevoir le tout dans un seul flux de données et de la diviser ensuite en utilisant le délimiteur. Vous aurez le nom de fichier et le fichier de données.
Mise à jour:
Code de travail (Ubuntu /Windows XP)
Utilisation
Il y a deux problèmes ici:
Des erreurs de syntaxe:
Vous utilisez un
from socket import *
. Ce n'est pas une erreur sur son propre, mais il devient un lorsque vous neexcept socket.timeout
.À l'aide de UDP:
L'aide du protocole UDP, la corruption ne devrait pas être une surprise. Vous ne voulez probablement pas à l'aide du protocole UDP ici, vous devez passer à TCP.
Voici pourquoi UDP n'est pas approprié ici:
Notez que la mise à TCP implique quelques refactoring de code (c'est un peu plus compliqué que de simplement remplacer
SOCK_DGRAM
avecSOCK_STREAM
), mais dans votre cas, vous avez à faire c'.Je ne dis pas que UDP est mauvais, mais il n'est pas approprié dans votre cas.