这个例子的作用:发送一个udp请求,服务器端返回这个客户端对外(公网)的ip和port
特点:
1、指定本地udp的端口,这样做的效果是短时间内udp对外的port就不会改变
2、服务器端是用c++写的,难点是怎样发送和读c++返回的内容
服务器约定返回8个字节,前4个字节是ip,后4个字节是端口
public NetInfo aUdpClient(String tag,int portLocal){
NetInfo returnNetInfo=new NetInfo();
DatagramPacket datagramPacket=null;
DatagramSocket datagramSocket=null;
String netAddress = "10.19.155.78";
int PORT_NUM = 7351;
//int LOCALPORT_NUM = 10988;
try {
/*** 发送数据***/
// 初始化datagramSocket,注意与前面Server端实现的差别
datagramSocket = new DatagramSocket(portLocal);
// 使用DatagramPacket(byte buf[], int length, InetAddress address, int port)函数组装发送UDP数据报
InetAddress address = InetAddress.getByName(netAddress);
// 发送数据,c++ 需要多发送一位,实际有效内容为dataArraay[0]=‘a’
byte[] dataArray=new byte[2];
dataArray[0]='a';
datagramPacket = new DatagramPacket(dataArray, dataArray.length, address, PORT_NUM);
datagramSocket.send(datagramPacket);
/*** 接收数据***/
byte[] receBuf = new byte[8];
DatagramPacket recePacket = new DatagramPacket(receBuf, receBuf.length);
datagramSocket.receive(recePacket);
int len=recePacket.getLength();
String myIp="";
int myPort=-1;
if(len!=-1 && len==8){
byte[] ipByte=new byte[4];
System.arraycopy(recePacket.getData(),0,ipByte,0,4);
myIp=bytesToIp(ipByte);
byte[] portByte=new byte[4];
System.arraycopy(recePacket.getData(),4,portByte,0,4);
myPort=bytes2int(portByte);
returnNetInfo.ip=myIp;
returnNetInfo.port=myPort;
}
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭socket
if(datagramSocket != null){
datagramSocket.close();
}
}
return returnNetInfo;
}