私はSocketsを初めて使用しますが、私の完全な理解不足を許してください。
サーバースクリプト(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行目
s.connect((Host、port))
Methの224行目の「/usr/lib/python2.7/socket.py」ファイル
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つのインターフェイスでのみ発生し、ローカルネットワークとは関係ありません。
1つの例としては、127.0.0.1
のみをリッスンし、別のホストからの接続を不可能にする場合があります。
このエラーは、何らかの理由でクライアントがサーバースクリプトを実行しているコンピューターのポートに接続できないことを意味します。これは、宛先へのルーティングの不足など、いくつかの原因で発生する可能性がありますが、サーバーにpingを送信できるため、そうではないはずです。もう1つの理由は、クライアントとサーバーの間にファイアウォールがあることです。サーバー自体またはクライアントにある可能性があります。ネットワークのアドレス指定を考えると、サーバーとクライアントの両方が同じLAN上にあると想定しているため、トラフィックをブロックする可能性のあるルーターは関係ないはずです。この場合、次のことを試してみます。
netstat -ntulp
のようなことができます。telnet LISTENING_IP LISTENING_PORT
はジョブを実行する必要がありますそして、調査結果をお知らせください。
Host = socket.gethostname() # Get the local machine name
port = 12397 # Reserve a port for your service
s.bind((Host,port)) # Bind to the port
このエラーはDNS解決に関連していると思います。この文Host = socket.gethostname()
はホスト名を取得しますが、オペレーティングシステムがホスト名をローカルアドレスに解決できない場合、エラーが発生します。 Linuxオペレーティングシステムは、/etc/hosts
ファイルを変更し、その中に1行追加できます。以下のようになります(「ホスト名」はsocket.gethostname()
が取得したものです)。
127.0.0.1 hostname
S = socket.socket()と仮定すると、サーバーは次の方法でバインドできます。
Host = socket.gethostname()
s.bind((Host, port))
方法2:
Host = socket.gethostbyname("localhost") #Note the extra letters "by"
s.bind((Host, port))
方法3:
Host = socket.gethostbyname("192.168.1.48")
s.bind((Host, port))
クライアント側でまったく同じメソッドを使用しないと、エラーが発生します:socket.error errno 111 connection refused.
そのため、サーバーで行うのとまったく同じ方法でホストを取得する必要があります。たとえば、クライアントの場合、それに応じて次のメソッドを使用します。
方法1:
Host = socket.gethostname()
s.connect((Host, port))
方法2:
Host = socket.gethostbyname("localhost") # Get local machine name
s.connect((Host, port))
方法3:
Host = socket.gethostbyname("192.168.1.48") # Get local machine name
s.connect((Host, port))
問題が解決することを願っています。
あなたのserver.pyファイルで:Host = socket.gethostname()
の代わりにHost ='192.168.1.94'
ターミナルでこのコマンドを試してください:
Sudo ufw enable
ufw allow 12397
接続をpingできましたが、それでも「接続が拒否されました」エラーが表示されました。私は自分自身にpingをしていたことが判明しました!それが問題でした。