我想通过NAT向客户端发送udp数据包,我们都属于不同的NAT,因此我们熟悉STUN的理论,因此实现此目的的方式是“打孔”通过通过一个简单的STUN服务器我们的方式..Java UDP STUN使用DatagramSocket打孔
基本上服务器直接返回外部IP地址,那就是“连接”,我就可以用它来将数据包发送给其他客户端的端口但是尽管我们设法让对方的外部IP和端口..我们仍然无法收到任何对方发送后...在搜索论坛和头几个小时的抓挠我们仍然无法想出一个解决方案......想知道是否有谁熟悉STUN能够给我们一些点TER值或在哪里,我们已经走了错误的建议......
下面是我们的小客户,我们已经写了...
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();
}
}