1. ホーム
  2. python

[解決済み] Pythonで "connection refused "というエラーが発生するのはなぜですか?(ソケット)

2022-02-07 05:12:55

質問

ソケットの初心者で、全く理解できていないことをお許しください。

サーバースクリプト(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()

とクライアントスクリプト(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

デスクトップターミナルに行き、スクリプトをタイプして起動する。

python server.py

その後、ノートパソコンの端末でクライアントスクリプトを起動します。

python client.py

が、以下のようなエラーが発生します。

ファイル "client.py", 行 9, in

s.connect((host,port))

ファイル "/usr/lib/python2.7/socket.py", ライン 224, in meth

return getattr(self._sock,name)(*args)

socket.error: [Errno 111] 接続が拒否されました

別のポート番号で試してみましたが、効果がありません。しかし、同じipとクライアントスクリプトのgethostname()メソッドを使用してホスト名を取得することができ、デスクトップ(サーバー)に対してpingを打つことができました。

どうすればいいですか?

の代わりに

host = socket.gethostname() #Get the local machine name
port = 12397 # Reserve a port for your service
s.bind((host,port)) #Bind to the port

を試してみてください。

port = 12397 # Reserve a port for your service
s.bind(('', port)) #Bind to the port

というのは、リスニングするソケットがあまり制限されないようにするためです。そうしないと、リスニングは1つのインターフェイスでのみ行われ、そのインターフェイスはローカルネットワークとは関係ないものになってしまうからです。

一例としては 127.0.0.1 このため、異なるホストからの接続は不可能です。