ConnectionRefusedError: [Errno 111] 接続が拒否されました

Zeeshan Afridi 2023年6月21日
  1. ConnectionRefusedError: [Errno 111] Connection rejected が Python で発生する理由
  2. Python で ConnectionRefusedError: [Errno 111] Connection requested を解決する方法
  3. まとめ
ConnectionRefusedError: [Errno 111] 接続が拒否されました

このエラーは、クライアントがサーバー スクリプトのシステムのポートに接続できないことを示しています。 サーバーにpingを実行できるため、そうではありません。

これは、宛先への不適切なルーティングなど、さまざまな理由で発生する可能性があります。 2 番目の可能性は、クライアントとサーバー (サーバーまたはクライアントのいずれか) の間にファイアウォールがあることです。

ネットワークアドレスに基づいて、サーバーとクライアントの両方が同じローカルエリアネットワーク上にある必要があるため、通信を停止する可能性のあるルーターまたはファイアウォールがあってはなりません.

ConnectionRefusedError: [Errno 111] Connection rejected が Python で発生する理由

このエラーは、無効な IP またはポートが原因でクライアントがサーバーにアクセスできない場合、またはアドレスが一意ではなく、別のサーバーによって使用されている場合に発生します。

サーバーが実行されていないときにも接続拒否エラーが発生するため、サーバーは最初に接続を受け入れる必要があるため、クライアントはサーバーにアクセスできません。

コード例:

# server code
import socket

s = socket.socket()
host = socket.gethostname()
port = 1717
s.bind((host, port))

s.listen(5)
while True:
    c, addr = s.accept()
    print("Got connection ", addr)
    c.send("Meeting is at 10am")
    c.close()
# client code
import socket

s = socket.socket()
host = "192.168.1.2"
port = 1717

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

出力:

socket.error: [Errno 111] Connection refused

Python で ConnectionRefusedError: [Errno 111] Connection requested を解決する方法

受信ソケットにできるだけアクセスできるようにしてください。 おそらく、アクセシビリティは 1つのインターフェイスでのみ行われ、ローカル エリア ネットワークには影響しません。

一方で、アドレス 127.0.0.1 のみをリッスンし、他のホストからの接続を不可能にする 1つのケースが考えられます。

コード例:

import socket

s = socket.socket()
host = socket.gethostname()
port = 1717
s.bind(("", port))

s.listen(5)
while True:
    c, addr = s.accept()
    print("Got connection ", addr)
    c.send("The Meeting is at 10 am")
    c.close()
import socket

s = socket.socket()
host = socket.gethostname()
port = 1717
s.bind(("", port))

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

出力:

Got connection('192.168.1.2')
The meeting is at 10 am

コマンド python server.py を実行すると、Got connection というメッセージが表示されます。 コマンド python client.py を実行すると同時に、サーバーからメッセージを受け取ります。

DNS 解決は、この問題の背後にあるもう 1つの理由である可能性があります。 socket.gethostname() はホスト名を返すため、オペレーティング システムがホスト名をローカル アドレスに変換できない場合、エラーが返されます。

Linux オペレーティング システムでは、1 行追加することでホスト ファイルを編集できます。

host = socket.gethostname()
port = 1717
s.bind((host, port))

gethostbyname を使用する

host = socket.gethostbyname("192.168.1.2")
s.bind((host, port))

したがって、ホストにアクセスするには、クライアント側とサーバー側で同じ手法を使用する必要があります。 たとえば、上記の手順をクライアントのケースに適用します。

ローカル ホスト名 hostnamehost = socket.gethostname() またはローカル ホストの特定の名前 host = socket.gethostbyname("localhost") を介してアクセスすることもできます。

host = socket.gethostname()
s.connect((host, port))
host = socket.gethostbyname("localhost")
s.connect((host, port))

まとめ

クライアントがサーバーに接続できない場合、Python のConnectionRefusedErrorが発生します。 いくつかの理由には、クライアントが IP アドレスまたはポート アドレスを認識していないことや、クライアントが接続したいときにサーバーが実行されていないことが含まれます。

この接続の問題を解決するには、上記の方法がいくつかあります。

著者: Zeeshan Afridi
Zeeshan Afridi avatar Zeeshan Afridi avatar

Zeeshan is a detail oriented software engineer that helps companies and individuals make their lives and easier with software solutions.

LinkedIn

関連記事 - Python Error