4

単純なUDPクライアント/サーバープログラムをリストしている本「Pythonネットワークプログラミングの基礎」の例を試しています。最初のプログラムでは同じマシン内にクライアント/サーバーがありましたが、2 番目のプログラムではサーバーが任意のマシンをリッスンしていました。この本には、2 台のマシン間の接続を確立する方法については詳しく説明されていません。

2 台のコンピューターがあり、どちらもインターネットに接続されています。互いにパケットを送受信するように構成するにはどうすればよいですか。

この例のソース コードは次のとおりです。

#!/urs/bin/env python
# UDP client and server for talking over a network

import random, socket, sys

s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

MAX  = 65535
PORT = 1060

if 2<= len(sys.argv) <= 3 and sys.argv[1] == 'server':
    interface = sys.argv[2] if len(sys.argv)>2 else ''
    s.bind((interface,PORT))
    print 'Listening at ', s.getsockname()
    while True:
        data, address = s.recvfrom(MAX)
        if random.randint(0,1):
            print 'The client at ', address, 'says:', repr(data)
            s.sendto('Your data was %d bytes ' % len(data) ,address)
        else:
            print 'Pretending to drop packet from ', address


elif len(sys.argv)==3 and sys.argv[1] == 'client':
    hostname = sys.argv[2]
    s.connect((hostname,PORT))
    print 'Client socket name is', s.getsockname()
    delay = 0.1
    while True:
        s.send('This is another message')
        print 'Waiting up to', delay, 'seconds for a reply'
        s.settimeout(delay)
        try:
            data = s.recv(MAX)
        except socket.timeout:
            delay *= 2 # wait even longer for the next request
            if delay > 2.0:
                raise RuntimeError('I think the server is down')
        except:
            raise # a real error so we let the user see it
        else: 
            break
    print 'The server says ', repr(data)

サーバーとして動作しているコンピュータのパブリック IP を見つけて、クライアントとして動作している別のマシンから接続しようとしましたが、応答がありませんでした。私はどちらのコンピューターでもプロキシの背後にいません。

4

2 に答える 2

1

まず、このようなアプリケーションを本当に試して学習したい場合は、これら 2 台のマシンを同じサブネット内のローカル ネットワークに接続して、各マシンが 192.168.x.2 と 192.168.x.2 のようなアドレスを持つようにする必要があります。あなたは何が起こっているかを知るでしょう...

次に、上記のアプリケーションを 1 つのマシンで「_application_name サーバー」として実行し、別のマシンで「_application_name クライアント」として実行する場合。両方のマシンが接続されていることがわかり、ローカル ネットワーク内で通信を開始します。

インターネットでは、安全なチャネルがたくさんあるため、IP/ポートを機能させるのは難しく、ほとんどの場合、必要なものが得られません。

于 2012-06-24T18:28:06.847 に答える
1

cs.py という名前のコード ファイル、サーバー インターフェイス アドレス 192.168.1.2、およびサーバー外部アドレス (インターネット アドレス) 2.2.2.2 を想定します。


サーバーでcs.py server 192.168.1.2を実行します。

LANとWANの間のサーバー側ルーターにサーバー用のNATがあることを確認してください

クライアント側で
cs.py client 2.2.2.2を実行します

于 2012-06-25T02:41:09.947 に答える