6 votes

ne peut pas comprendre [Errno 111] Connexion refusée

Je suis sûr qu'il s'agit d'une question très simple (HTTP newbie) mais je n'ai pas trouvé la réponse moi-même. Je vous serais reconnaissant de bien vouloir m'aider.

J'ai un serveur web :

serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind((socket.gethostname(), 8000))
serversocket.listen(10)

while True:
    print("waiting...")
    conn = serversocket.accept()
    data = conn[0].recv(1024)
    print(data) 

J'ai également un client qui essaie d'envoyer un GET demande :

import requests 
URL = "http://localhost:8000/api/v1/a?b=2"
r = requests.get(url = URL)

A ce stade, je ne veux rien faire avec la requête, juste pour être sûr de la recevoir, mais cela échoue...

Je cours :

  • python3 server.py &
  • python3 client.py

et a obtenu :

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 562, in urlopen
    body=body, headers=headers)
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 387, in _make_request
    conn.request(method, url, **httplib_request_kw)
  File "/usr/lib/python3.4/http/client.py", line 1088, in request
    self._send_request(method, url, body, headers)
  File "/usr/lib/python3.4/http/client.py", line 1126, in _send_request
    self.endheaders(body)
  File "/usr/lib/python3.4/http/client.py", line 1084, in endheaders
    self._send_output(message_body)
  File "/usr/lib/python3.4/http/client.py", line 922, in _send_output
    self.send(msg)
  File "/usr/lib/python3.4/http/client.py", line 857, in send
    self.connect()
  File "/usr/lib/python3.4/http/client.py", line 834, in connect
    self.timeout, self.source_address)
  File "/usr/lib/python3.4/socket.py", line 512, in create_connection
    raise err
  File "/usr/lib/python3.4/socket.py", line 503, in create_connection
    sock.connect(sa)
ConnectionRefusedError: [Errno 111] Connection refused

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/requests/adapters.py", line 330, in send
    timeout=timeout
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 612, in urlopen
    raise MaxRetryError(self, url, e)
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=8000): Max retries exceeded with url: /api/v1/similar?word=apple (Caused by <class 'ConnectionRefusedError'>: [Errno 111] Connection refused)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "client.py", line 5, in <module>
    r = requests.get(url = URL)
  File "/usr/lib/python3/dist-packages/requests/api.py", line 55, in get
    return request('get', url, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/api.py", line 44, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 455, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 558, in send
    r = adapter.send(request, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/adapters.py", line 378, in send
    raise ConnectionError(e)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=8000): Max retries exceeded with url: /api/v1/similar?word=apple (Caused by <class 'ConnectionRefusedError'>: [Errno 111] Connection refused)

5voto

George Shuklin Points 29

Connection refused est généré par le noyau parce que l'expéditeur refuse d'établir une connexion TCP. Les raisons possibles sont les suivantes :

  1. Non à l'écoute sur cet hôte/port
  2. iptables (ou autre pare-feu) spécifiquement -j REJECT des connexions.

D'après votre code, il est difficile de dire si vous écoutez sur un hôte/port approprié ou non.

Comment déboguer ?

  1. Faites fonctionner votre service. Sans vous connecter, exécutez 'netstat -lnpt', qui devrait vous fournir la liste des services à l'écoute sur cet hôte.
  2. Essayer nc host port (note - pas un ':', mais un espace ici), si la connexion est refusée, nc se terminera instantanément. Si ce n'est pas le cas, vous avez établi la connexion (essayez de taper 'GET / HTTP/1.1' et Enter deux fois dans ce cas).
  3. Il suffit d'imprimer la sortie de socket.gethostname() y port dans votre code.

Je soupçonne que dans votre cas socket.gethostname() a été résolu en quelque chose de différent de localhost .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X