0

我正在尝试创建 p2p 连接。这是一个我已经检查过的只是测试应用程序,但它似乎无法通过互联网运行。这是我在我的电脑上用来向我的朋友发送数据报的 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 套接字代码选择一个随机端口号(即 port=0)并使用 STUN 服务器(或等效服务器)来确定您的公共 IP 地址和此本地套接字的公共端口映射。

  • 使用可靠的服务来交换 IP/端口。由于您只是试图让一个数据包通过,因此首先使用电话口头交换此信息就足够了。

  • 您不需要一次发送 500 个数据包。远程 NAT 上的防火墙代码可能将此视为 DOS 攻击并阻止一切。尝试每秒发送 1 个。

  • 在尝试执行代码正在执行的连接检查时,您应该同时侦听和发送定期数据包。(例如两个单独的线程或定期轮询)。

  • 在两个端点都确认连接之前,不要关闭套接字。正如您现在所拥有的,您的第一个程序在发送数据包突发后立即关闭套接字。

  • 在这里阅读我的完整答案:https ://stackoverflow.com/a/8524609/104458

于 2013-11-11T06:29:05.300 回答