3

次の問題があります。

リモート マシンに非常に単純な Java Datagram クライアントとサーバーを配置しています。また、クライアントは、以前にサーバーにパケットを送信しない限り、サーバーから何も受信しません (パケットが保持していた情報は関係ありません)。

私のクライアントは次のようになります。

    public static void TheClient() throws Exception { 
        ds = new DatagramSocket(clientPort); 
        while(true) { 
            DatagramPacket p = new DatagramPacket(buffer, buffer.length);   
            ds.receive(p); 
            System.out.println(new String(p.getData(), 0, p.getLength())); 
        } 
    } 

基本的に、ポート clientPort でリッスンし、受信したものを出力するだけです。しかし、それは機能しません。

少し変更すると、問題が解決します。

public static void TheClient() throws Exception {
    ds = new DatagramSocket(clientPort); 

    //Sending an empty packet
    byte tempBuffer1[] = new byte[10];
    InetAddress address = InetAddress.getByName(SERVER_IP);
    DatagramPacket packet1 = new DatagramPacket(
            tempBuffer1, tempBuffer1.length, address, serverPort);
    ds.send(packet1);

    while(true) { 
        DatagramPacket p = new DatagramPacket(buffer, 
                buffer.length);     
        ds.receive(p); 
        System.out.println(new String(p.getData(), 0, 
                p.getLength())); 
    } 
} 

この問題の原因を知っている人はいますか? 回避策は問題を解決しましたが、なぜそれが最初に機能しなかったのか、私には意味がありません。そのため、ソリューションが実際にはすべてのコンピューターで機能するとは限りません。

また、クライアントとサーバーの両方が同じマシン上にある場合、コードは正常に機能することに注意してください。

4

2 に答える 2

1

PC がプライベート IP アドレス (通常は "10.xxx" または "192.168.xx" で始まるアドレス) を使用しているかどうかを確認します。その場合、最も可能性の高い原因は、単一のパブリック アドレスと複数のプライベート アドレスを共有する NAT ベースのファイアウォールを使用していることです。

パケットをアウトバウンドに送信すると、ファイアウォールは、どの内部アドレスがリターン パケットを受信する必要があるかを認識します。ただし、接続が外部アドレスから開始された場合、どの内部アドレスがトラフィックを受信する必要があるかを知る方法がありません。ほとんどの SOHO (小規模オフィス/ホーム オフィス) ルーターでは、トラフィックを特定の内部 IP アドレスに「ポート転送」できます。DHCP を使用している場合は、自分自身に静的 IP アドレスを割り当てる必要があります。そうしないと、別の IP アドレスを取得するため、ポート転送が将来的に機能しなくなる可能性があります。

于 2013-01-23T03:19:33.110 に答える