java实现udp接收16进制报文通信(注释齐全,简单明了)

1 篇文章 0 订阅

今天,废话不多说,直接上代码,保存起来,方便自己和同道中人参考

由于udp通信的不可靠性,经常丢包,所以大家以后用到的话,发送报文时,记得发三遍,三遍丢包情况就基本不会发生。

现在先上通信的接收代码

   //定义一个端口号
      int port = 10086;
      try {
        //创建接收方的套接字,监听端口号
        DatagramSocket getSocket = new DatagramSocket(port);
        while(true){
          //确定接收的数据报文的长度,来建立缓冲区
          byte[] buf = new byte[36];
          //创建接收类型的数据包,数据先储存在缓冲区
          DatagramPacket getPacket = new DatagramPacket(buf,buf.length);
          //通过套接字接收数据
          getSocket.receive(getPacket);
          //解析接收到到16机制数据
          byte[] bytes = getPacket.getData();
          String data = getBufHexStr(bytes);
          LOG.info("data:"+data);//接收成功后回复
          backHeadle(getSocket,getPacket);
        }

      } catch (SocketException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
将16进制的byte数组转换成字符串getBufHexStr方法的代码段: 
 //将16进制的byte数组转换成字符串
  public static String getBufHexStr(byte[] raw){
    String HEXES = "0123456789ABCDEF";
    if ( raw == null ) {
      return null;
    }
    final StringBuilder hex = new StringBuilder( 2 * raw.length );
    for ( final byte b : raw ) {
      hex.append(HEXES.charAt((b & 0xF0) >> 4))
        .append(HEXES.charAt((b & 0x0F)));
    }
    return hex.toString();
  }

这里上发送的 代码段:

//回复数据
  private static void backHeadle( DatagramSocket getSocket,DatagramPacket getPacket) {
    //通过数据包得到发送方的套接字ip
    SocketAddress sendAddress = getPacket.getSocketAddress();
    //确定要回复给发送方的消息内容,并转换成字符数组
    String feedback = "211502a0";
    //由于16进制字符发送时只能发送字节,这里讲字符串转换成字节
    byte bytes[] = getHexBytes(feedback);
    //创建发送类型的数据包
    DatagramPacket sendPacket = new DatagramPacket(bytes,bytes.length,sendAddress);
    //通过套接字发送数据
    try {
      getSocket.send(sendPacket);
      LOG.info("发送成功");
    } catch (IOException e) {
      LOG.info("发送失败");
      e.printStackTrace();
    }
  }

将16进制的字符串转成字符数组 getHexBytes的方法

 //将16进制的字符串转成字符数组
  public static byte[] getHexBytes(String str){
    byte[] bytes = new byte[str.length() / 2];
    for(int i = 0; i < str.length() / 2; i++) {
      String subStr = str.substring(i * 2, i * 2 + 2);
      bytes[i] = (byte) Integer.parseInt(subStr, 16);
    }
    return bytes;
  }

小M微信二维码 : 有问题可以加微信

打赏二维码:觉得有用有帮助的可以给小M~打赏哦

  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值