0

p2p接続を作成しようとしています。これは私が確認したテストアプリですが、インターネット経由では機能しないようです。これは、友人にデータグラムを送信するために PC で使用している Java コードです。

    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.net.*;
    import javax.net.ssl.SSLServerSocket;

    public class j2{


    public static void main(String[] args) throws Exception {

    InetAddress IPAddress = InetAddress.getByName("my friend's public IP"); 
    DatagramSocket clientSocket = new DatagramSocket(3456);


    System.out.println("Sending data");
    String datamsg = "hello ";
    byte[] sendData = datamsg.getBytes("UTF-8");
    byte [] receiveData = new byte[10];
    DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress,         7890);  

    int i = 500;
    //incase if some packets are lost
    while(i-->1)
    {
    clientSocket.send(sendPacket);
    }
    System.out.println("Data sent");

    System.out.println(clientSocket.isClosed());

    clientSocket.close();        



    }
    }

'

    //My friend uses this app to receive a data gram:
    // port 7890 is used to send data gram and create a hole. The same is used to     receice data.

'

    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.net.*;
    import javax.net.ssl.SSLServerSocket;

    public class j1{


    public static void main(String[] args) throws Exception {

    InetAddress IPAddress = InetAddress.getByName("any ip"); //does not matter as it is used to open a hole
    DatagramSocket clientSocket = new DatagramSocket(7890);


    System.out.println("Sending data");
    String datamsg = "hello ";
    byte[] sendData = datamsg.getBytes("UTF-8");
    byte [] receiveData = new byte[10];
    DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 5000);  

    int i = 500;

    while(i-->1)
    {
    clientSocket.send(sendPacket);
    }
    System.out.println("Data sent");

    System.out.println(clientSocket.isClosed());



    DatagramPacket receivePacket = new DatagramPacket(sendData, sendData.length);                   

    clientSocket.receive(receivePacket);  

     System.out.println("Packet received");
     String msg = new String(receivePacket.getData());
    clientSocket.close();        

    }
    }'

    // I am not using a stun server as i already know my friends public ip address. We both have disabled our firewall as well.
4

1 に答える 1

0

あなたのアプローチは、NATホールパンチングを行うための最も信頼できる方法ではありません. せいぜい「時々うまくいく」でしょう。

以下にいくつかの提案を示します。

  • ポート番号をハードコーディングしないでください。UDP ソケット コードでランダムなポート番号 (ポート = 0) を選択し、STUN サーバー (または同等のサーバー) を使用して、このローカル ソケットのパブリック IP アドレスとパブリック ポートのマッピングを確認します。

  • 信頼できるサービスを使用して、IP/ポートを交換します。単一のパケットを通過させようとしているだけなので、電話を使用して口頭でこの情報を交換することから始めてください。

  • 一度に 500 個のパケットを送信する必要はありません。リモート NAT のファイアウォール コードは、これを DOS 攻撃と見なし、すべてをブロックする可能性があります。1 秒に 1 のように送信してみてください。

  • コードが実行している接続チェックを実行しようとするときは、定期的なパケットを同時にリッスンして送信する必要があります。(たとえば、2 つの別個のスレッドまたは定期的なポーリング)。

  • 両方のエンドポイントで接続が確認されるまで、ソケットを閉じないでください。現在のように、最初のプログラムは、パケット バーストを送信した直後にソケットを閉じます。

  • ここで私の完全な答えを読んでください:https://stackoverflow.com/a/8524609/104458

于 2013-11-11T06:29:05.300 に答える