udp请求,指定本地端口,用java写client,用c++写server

这个例子的作用:发送一个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;
}

猜你喜欢

转载自blog.csdn.net/tantion/article/details/80350724