web-dev-qa-db-fra.com

Pourquoi l'erreur "connexion refusée" apparaît-elle en Python? (Douilles)

Je suis nouveau dans Sockets, veuillez excuser mon manque total de compréhension. 

J'ai un script de serveur (server.py): 

#!/usr/bin/python

import socket #import the socket module

s = socket.socket() #Create a socket object
Host = socket.gethostname() #Get the local machine name
port = 12397 # Reserve a port for your service
s.bind((Host,port)) #Bind to the port

s.listen(5) #Wait for the client connection
while True:
    c,addr = s.accept() #Establish a connection with the client
    print "Got connection from", addr
    c.send("Thank you for connecting!")
    c.close()

et script client (client.py): 

#!/usr/bin/python 

import socket #import socket module

s = socket.socket() #create a socket object
Host = '192.168.1.94' #Host i.p
port = 12397 #Reserve a port for your service

s.connect((Host,port))
print s.recv(1024)
s.close

Je vais sur mon terminal de bureau et lance le script en tapant: 

python server.py

après quoi, je vais sur le terminal de mon ordinateur portable et lance le script client: 

python client.py

mais j'obtiens l'erreur suivante: 

Fichier "client.py", ligne 9, dans 

s.connect ((hôte, port)) 

Fichier "/usr/lib/python2.7/socket.py", ligne 224, en meth

retourne getattr (self._sock, name) (* args)

socket.error: [Errno 111] Connexion refusée

J'ai essayé d'utiliser différents numéros de port en vain. Cependant, j'ai pu obtenir le nom d'hôte en utilisant la même adresse IP et la méthode gethostname () dans le script client et je peux envoyer une requête ping au bureau (serveur). 

48
Sheldon

Au lieu de 

Host = socket.gethostname() #Get the local machine name
port = 12397 # Reserve a port for your service
s.bind((Host,port)) #Bind to the port

tu devrais essayer

port = 12397 # Reserve a port for your service
s.bind(('', port)) #Bind to the port

afin que la prise d'écoute ne soit pas trop restreinte. Sinon, l’écoute ne se produit que sur une interface qui, à son tour, n’est pas liée au réseau local.

Un exemple pourrait être qu’il n’écoute que 127.0.0.1, ce qui rend impossible la connexion à partir d’un hôte différent.

65
glglgl

Cette erreur signifie que, pour une raison quelconque, le client ne peut pas se connecter au port de l'ordinateur exécutant le script serveur. Cela peut être dû à peu de choses, comme le manque de routage vers la destination, mais comme vous pouvez envoyer une requête ping au serveur, cela ne devrait pas être le cas. L'autre raison peut être que vous avez un pare-feu entre votre client et le serveur - il peut être sur le serveur lui-même ou sur le client. Compte tenu de votre adressage réseau, je suppose que le serveur et le client sont sur le même réseau local. Il ne devrait donc y avoir aucun routeur impliqué susceptible de bloquer le trafic. Dans ce cas, j'essaierais ce qui suit:

  • vérifiez si vous avez vraiment ce port en écoute sur le serveur (cela devrait vous dire si votre code fait ce que vous pensez qu'il devrait): en fonction de votre système d'exploitation, mais sous linux, vous pourriez faire quelque chose comme netstat -ntulp
  • vérifier à partir du serveur, si vous acceptez les connexions au serveur: toujours basé sur votre système d'exploitation, mais telnet LISTENING_IP LISTENING_PORT devrait faire l'affaire
  • vérifiez si vous pouvez accéder au port du serveur à partir du client, mais sans utiliser le code: utilisez uniquement le telnet (ou la commande appropriée pour votre système d'exploitation) à partir du client.

et laissez-nous savoir les résultats.

7
SpankMe

essayez cette commande dans le terminal:

Sudo ufw enable
ufw allow 12397
1
mou ayad
Host = socket.gethostname()  # Get the local machine name
port = 12397                 # Reserve a port for your service
s.bind((Host,port))          # Bind to the port

Je pense que cette erreur peut être liée à la résolution DNS . Cette phrase Host = socket.gethostname() récupère le nom d'hôte, mais si le système d'exploitation ne peut pas résoudre le nom d'hôte en adresse locale, vous obtiendrez l'erreur . Le système d'exploitation Linux peut modifiez le fichier /etc/hosts, ajoutez-y une ligne. Cela ressemble à ce qui suit ('hostname' correspond à socket.gethostname() got).

127.0.0.1   hostname
1
aoniao

Supposez s = socket.socket () Le serveur peut être lié par les méthodes suivantes: Méthode 1:

Host = socket.gethostname()
s.bind((Host, port))

Méthode 2:

Host = socket.gethostbyname("localhost")  #Note the extra letters "by"
s.bind((Host, port))

Méthode 3:

Host = socket.gethostbyname("192.168.1.48")
s.bind((Host, port))

Si vous n'utilisez pas exactement la même méthode côté client, vous obtiendrez l'erreur: socket.error errno 111 connection refused.

Donc, vous devez utiliser côté client exactement la même méthode pour obtenir l'hôte, comme vous le faites sur le serveur. Par exemple, dans le cas d'un client, vous utiliserez les méthodes suivantes:

Méthode 1:

Host = socket.gethostname() 
s.connect((Host, port))

Méthode 2:

Host = socket.gethostbyname("localhost") # Get local machine name
s.connect((Host, port))

Méthode 3:

Host = socket.gethostbyname("192.168.1.48") # Get local machine name
s.connect((Host, port))

J'espère que cela résoudra le problème.

1
M Shiraz Baig

dans votre fichier server.py, faites: Host ='192.168.1.94' au lieu de Host = socket.gethostname()

0
Majd Saadaoui

J'étais en mesure de faire un ping sur ma connexion, mais je recevais TOUJOURS l'erreur "Connexion refusée". Il s'avère que je me cinglais! C'était ça le problème.

0
Azizbro