繁体   English   中英

无法理解[Errno 111]连接被拒绝

[英]can't understand [Errno 111] Connection refused

我确定这是一个非常简单的问题(HTTP新手),但我自己找不到答案。 在这里,我将不胜感激。

我有一个网络服务器:

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) 

我也有一个客户端尝试发送GET请求:

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

在这个阶段,我不想对请求做任何事情,只是为了确保我收到了请求,但这失败了……

我跑:

  • python3 server.py &
  • python3 client.py

并得到:

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)

Connection refused是由内核,因为发送者拒绝建立TCP连接生成。 可能的原因是:

  1. 禁止在此主机/端口上监听
  2. iptables(或其他防火墙)特别是-j REJECT连接。

从代码中很难说出您是否在正确的主机/端口上进行监听。

如何调试?

  1. 运行您的服务。 在不连接它的情况下,运行“ netstat -lnpt”,它应该为您提供在此主机上侦听的服务列表。
  2. 尝试使用nc host port (注意-不是':',而是空格),如果连接被拒绝,nc将立即终止。 如果不是,则表明已建立连接(在这种情况下,尝试键入“ GET / HTTP / 1.1”并输入两次)。
  3. 只需在代码中打印socket.gethostname()port变量的输出即可。

我怀疑在您的情况下, socket.gethostname()已解析为与localhost不同的名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM