HOWTO · Python

ConnectionRefusedError: [Errno 61] Python で接続が拒否されました

このチュートリアルでは、Python の ConnectionRefusedError について説明します。

このページの内容

クライアント サーバー プログラムを設計しているときに、エラー ConnectionRefusedError が発生することがあります。 これは、コーディングの問題により、クライアント プログラムがサーバー プログラムに接続できなかった場合に発生しました。

この記事では、Python で ConnectionRefusedError を取得する方法を示します。 また、トピックをより簡単にするために、必要な例と説明を使用してトピックについて説明します。

エラー ConnectionRefusedError が Python でどのように発生するか

すでに説明したように、このエラーは主にクライアント プログラムがサーバーに接続できない場合に発生します。 これらを理解するために、以下で共有するクライアント/サーバーのサンプル プログラムを考えてみましょう。

以下のサーバー プログラムのサンプル コードを見てみましょう。

import socket


def ServerProgram():
    host = socket.gethostname()
    port = 5000
    ServerSocket = socket.socket()
    ServerSocket.bind((host, port))
    ServerSocket.listen(2)
    conn, ClientAddress = ServerSocket.accept()
    print("Connection from: " + str(ClientAddress))
    while True:
        ClientMsg = conn.recv(1024).decode()
        if not ClientMsg:
            break
        print("from connected user: " + str(ClientMsg))
        ClientMsg = input(" -> ")
        conn.send(ClientMsg.encode())
    conn.close()


if __name__ == "__main__":
    ServerProgram()

上記のプログラムでは、ポートを 5000 に設定していることに注意してください。 次に、クライアント プログラムを見てみましょう。

import socket


def ClientProgram():
    host = socket.gethostname()
    port = 5001
    ClientSocket = socket.socket()
    ClientSocket.connect((host, port))
    ClientMessage = input(" -> ")
    while ClientMessage.lower().strip() != "bye":
        ClientSocket.send(ClientMessage.encode())
        ServerMsg = ClientSocket.recv(1024).decode()
        print("Received from server: " + ServerMsg)
        ClientMessage = input(" -> ")
    ClientSocket.close()


if __name__ == "__main__":
    ClientProgram()

クライアント プログラムで意図的にミスを犯しています。クライアント プログラムのポートを 5001 に設定しています。 サーバー プログラムの後にクライアント プログラムを実行すると、次のようなエラー メッセージが表示されます。

Traceback (most recent call last):
  File "F:\Python\client.py", line 25, in <module>
    ClientProgram()
  File "F:\Python\client.py", line 9, in ClientProgram
    ClientSocket.connect((host, port))  # connect to the server
ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it

このエラーは、クライアント プログラムがサーバーに接続できなかったために発生しました。 このエラーは、サーバー プログラムを最初に起動した場合にも発生する可能性があります。

この状況では、クライアント プログラムは接続するサーバー プログラムを見つけられません。

Python で ConnectionRefusedError を修正する方法

上記のエラーは、正確なサーバー ポート 5000 を使用して簡単に修正できます。 コードを更新すると、次のようになります。

import socket


def ClientProgram():
    host = socket.gethostname()
    port = 5000  # We fixed here.
    ClientSocket = socket.socket()
    ClientSocket.connect((host, port))
    ClientMessage = input(" -> ")
    while ClientMessage.lower().strip() != "bye":
        ClientSocket.send(ClientMessage.encode())
        ServerMsg = ClientSocket.recv(1024).decode()
        print("Received from server: " + ServerMsg)
        ClientMessage = input(" -> ")
    ClientSocket.close()


if __name__ == "__main__":
    ClientProgram()

クライアント プログラムを実行すると、クライアント側で以下の出力が得られます。

 -> Hi Server
Received from server: Hi Client
 -> This is a message from the client
Received from server: This is a message from the server

そして、サーバー側で以下の出力が表示されます。

Connection from: ('192.168.0.159', 11418)
from connected user: Hi Server
 -> Hi Client
from connected user: This is a message from the client
 -> This is a message from the server

クライアント プログラムを実行する前に、サーバー プログラムを実行する必要があることに注意してください。 そうしないと、同じエラーが発生します。

ここで説明するコマンドとプログラムは、Python プログラミング言語で記述されていることに注意してください。