web-dev-qa-db-ja.com

Pythonのインターネット経由のソケット接続?

Python 2.7.xで基本的なクライアントサーバーソケットプログラムを作成しました。異なるマシンでも同じネットワーク上で完全に正常に実行されていますが、サーバーとクライアントを異なるネットワークで実行すると(私のクライアントが私の友人のネットワーク)それはエラーを返さず、待ち続けます。コードをデバッグする方法が理解できません。ポート80のすべてのサービスを強制終了してポート80を使用しています。ポートも実行しました。両方のマシンのポート80で転送します。

私のコードは次のとおりです。

client.py

import socket              

s = socket.socket()        
Host = '103.47.59.130' 
port = 80               

s.connect((Host, port))
while True: 
    print "From Server: ", s.recv(1024)  #This gets printed after sometime
    s.send(raw_input("Client please type: "))

s.close()                     

server.py

import socket               

s = socket.socket()         # Create a socket object
Host = '192.168.0.104'    #private ip address of machine running Fedora
port = 80                
s.bind((Host, port))       

s.listen(5)                
c, addr = s.accept()       
print 'Got connection from', addr    #this line never gets printed
while True:
   c.send(raw_input("Server please type: "))
   print "From Client: ", c.recv(1024)

c.close()                

**サーバーから:**を出力することがありますが、メッセージを送受信しません。

PS:以前にStack Overflowで検索しましたが、関連するものが見つかりません。

7
Sanyam Jain

これを使用して ソフトウェア ポートフォワーディングを実装します。 80などの非常に一般的に使用されるポートの使用に関連する問題を防ぐために、サーバーに別のポート(5006など)を使用することをお勧めします。基本的に、ソフトウェアは次のように機能します。

  • [接続]をクリックすると、ルーターが検索され、ルーターが見つかった場合は、既存のポートマッピングが一覧表示されます。
  • ポートマッピング(右側)を作成します。デフォルトのプロトコルはTCPです。
  • ルーターのポート、たとえば5001(外部ポートと呼ばれる)を選択します
  • サーバー上のポート、おそらく5006(内部ポートと呼ばれる)を選択します
  • 次に、ルーターは、ポート5001に到着したすべてのデータを、プライベートIPを使用してサーバーに転送するように指示されます。具体的には、サーバーのポート5006に転送します。

したがって、クライアントが行う必要があるのは、サーバーのパブリックIP、特にポート5001にデータを送信することだけです。もちろん、このデータは最初にルーターに到着し、ルーターは構成されたとおりに動作し、すべてをサーバーのポート5006に転送します。インターネットゲートウェイがポート転送をサポートしている場合にのみ機能します。

クライアント:

import socket              

s = socket.socket()        
Host = '103.47.59.130' 
port = 5001               

s.connect((Host, port))
while True: 
    try:
        print "From Server: ", s.recv(1024) 
        s.send(raw_input("Client please type: "))
    except:
        break
s.close()

サーバ:

import socket               

s = socket.socket()         # Create a socket object
Host = '192.168.0.104'    #private ip address of machine running Fedora
port = 5006                
s.bind((Host, port))       

s.listen(5)                
c, addr = s.accept()       
print 'Got connection from', addr    
while True:
   c.send(raw_input("Server please type: "))
   print "From Client: ", c.recv(1024)

c.close()
2
TisteAndii

サーバーでパブリックIPアドレスまたは0.0.0.0を使用し、モデム/ルーターが指定されたポート(通常はポート転送と呼ばれる)での着信接続を許可していることを確認する必要があります。

それが役に立てば幸い!

1
cdonts

基本的なネットワークのトラブルシューティングを実行する必要があるようです。あなたの説明によると、自分のネットワーク上の他のマシンには接続できますが、別のネットワーク上のマシンには接続できません。他のネットワーク上のマシンで同じ種類のテストを試すことができます。それは、それ自体のネットワーク上の他のマシンに接続できますか、ネットワーク外の他のマシンに接続できますか。

非常に価値のあるツールには、ping、tracepath、tcpdump、およびnc(netcat)が含まれます。

最終的に、netcatとの接続が可能であれば、問題はコードにあると見なすことができますが、それができない場合は、ネットワークの問題を見つけることができます。

0
dancancode