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).
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.
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:
netstat -ntulp
telnet LISTENING_IP LISTENING_PORT
devrait faire l'affaireet laissez-nous savoir les résultats.
essayez cette commande dans le terminal:
Sudo ufw enable
ufw allow 12397
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
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.
dans votre fichier server.py, faites: Host ='192.168.1.94'
au lieu de Host = socket.gethostname()
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.