Я пытаюсь отправить пакет udp клиенту через NAT, мы оба принадлежим к другому NAT, мы знакомы с теорией STUN, поэтому путь для достижения этой цели - «пробить» нашчерез простой сервер STUN ..
По сути, сервер просто возвращает внешний IP-адрес и порт другого «подключенного» клиента, который я затем могу использовать для отправки пакета клиенту через NAT.... однако, несмотря на то, что нам удалось получить внешние IP-адреса и порты друг друга .. мы все еще не можем получить что-либо друг от друга после отправки ... После поиска по форумам и многих часов царапин головы мы все еще не можем придуматьрешение ... было бы интересно, если кто-нибудь, кто знаком с STUN, сможет дать нам несколько советов или советов, где мы ошиблись ...
Ниже приведен наш маленький клиент, которого мы написали ...
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import javax.swing.JOptionPane;
public class Client {
DatagramSocket socket;
public Client(){
try {
socket = new DatagramSocket();
String data = "Initiate Stun Server";
byte[] receive = data.getBytes();
InetAddress host = InetAddress.getByName("the.stun.server.ipaddress");
DatagramPacket pk = new DatagramPacket(receive,receive.length,host,9345);
socket.send(pk); //send packet to server to initiate udp communication
//spawn a new Thread to listen for any incoming packets
new Thread(){
public void run(){
byte[] r;
DatagramPacket rp;
while(true){
System.out.println("Start listening on new socket");
r = new byte[1024];
rp = new DatagramPacket(r,r.length);
try {
socket.receive(rp);
System.out.println(new String(rp.getData()));
} catch (IOException e) {
e.printStackTrace();
}
}
}
}.start();
String m = JOptionPane.showInputDialog(null,"Enter message to send");
InetAddress connect = InetAddress.getByName(JOptionPane.showInputDialog(null,"Enter address to send message to"));//This is where we input the external ip
int connectPort = Integer.parseInt(JOptionPane.showInputDialog(null,"Enter port of the addressee"));//input port
DatagramPacket p = new DatagramPacket(m.getBytes(),m.getBytes().length,connect,connectPort);
socket.send(p);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String args[]){
Client c = new Client();
}
}