Python socket.erreur: [Errno 111] Connexion refusée
Je suis en train d'écrire un programme pour le transfert de fichiers à l'aide de sockets. Le serveur fin du code est en cours d'exécution fine. Toutefois, dans le côté client, j'obtiens l'erreur suivante
Traceback (most recent call last):
File "client.py", line 54, in <module>
uploadFiles(directory)
File "client.py", line 36, in uploadFiles
transferFile(fname)
File "client.py", line 13, in transferFile
cs.connect((HOST, 36258))
File "/usr/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 111] Connection refused
Mon code est comme suit
import os
import socket
def transferFile(fname):
HOST = '127.0.0.1'
CPORT = 36258
MPORT = 36250
FILE = fname
cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
cs.connect((HOST, 36258))
cs.send("SEND " + FILE)
cs.close()
ms = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ms.connect((HOST, MPORT))
f = open(FILE, "rb")
data = f.read()
f.close()
ms.send(data)
ms.close()
def uploadFiles(directory):
home = os.getenv("HOME")
folder = str(home + "/" + directory)
os.chdir(folder)
dirList = os.listdir(folder)
print dirList
for fname in dirList:
if fname.endswith('.bin'):
transferFile(fname)
os.chdir(os.getenv("HOME"))
directory = "testdownload"
if not os.path.exists(directory):
os.makedirs(directory)
os.chdir(directory)
uploadFiles(directory)
J'ai essayé de chercher de l'aide sur Google et les autres postes sur un Débordement de Pile, aucun d'entre eux ont aidé. Quelqu'un peut-il m'aider?
Les numéros de ligne peut être différent depuis que j'ai collé seulement une partie du code
Comment savez-vous que le serveur est en train de travailler? Le message d'erreur suggère que la connexion TCP 127.0.0.1:36258 est refusé. Ce qui se passe lorsque vous exécutez
J'ai couru
Pour ajouter au commentaire ci-dessus, j'ai ajouté un 2 secondes après le
telnet 127.0.0.1 36258
?J'ai couru
telnet 127.0.0.1 36258
et a été en mesure de voir le lien. Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
J'ai vérifié sur le serveur et de constater qu'il y avait un problème avec les sockets pas ouvrir en synchronisation avec le côté client MerciPour ajouter au commentaire ci-dessus, j'ai ajouté un 2 secondes après le
cs.close()
et après ms.close()
de manière à synchroniser avec les connexions sur le serveur de gamme et il a travaillé comme un charme. Grâce tcOriginalL'auteur hld619 | 2012-07-20
Vous devez vous connecter pour publier un commentaire.
Le problème était évidemment (comme vous l'avez compris) que le port 36250 n'était pas ouverte sur le côté serveur au moment où vous avez essayé de vous connecter (donc connexion refusée). Je peux voir que le serveur était censé ouvrir cette prise après réception de
SEND
de commande sur une autre connexion, mais il n'était apparemment pas d'ouverture [il] en synchronisation avec le côté client".Bien, la raison principale serait il n'y a pas de synchronisation que ce soit. Appelant:
serait juste de placer les données dans un OS de la mémoire tampon;
close
serait probablement vider les données et l'insérer dans le réseau, mais il serait presque certainement de retour avant que les données permettrait d'atteindre le serveur. L'ajout desleep
aprèsclose
pourrait atténuer le problème, mais ce n'est pas la synchronisation.La bonne solution serait de assurez-vous que le serveur a ouvert la connexion. Ce serait exiger un serveur de vous envoyer un message de retour (par exemple
OK
, ou mieuxPORT 36250
pour indiquer l'emplacement de connexion). Cela permettrait de s'assurer que le serveur est déjà en écoute.L'autre chose est vous devez vérifier les valeurs de retour de
send
à assurez-vous combien d'octets a été prise à partir de votre tampon. Ou utilisersendall
.(Désolé pour déranger avec cette réponse tardive, mais j'ai trouvé ceci pour être un trafic élevé de la question et je n'aimais pas vraiment le sommeil idée dans la section des commentaires.)
OriginalL'auteur tomasz