鸿蒙UDP封装及使用

一.封装

TypeScript 复制代码
import { socket } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { util } from '@kit.ArkTS';

//执行UDP通讯的对象
let udpSocket:socket.UDPSocket= socket.constructUDPSocketInstance();
// 连接成功变量
let bindSuccess = false
export class UDPUtils {
  //ArrayBuffer转utf8字符串
   buf2String(buf: ArrayBuffer) {
    let msgArray = new Uint8Array(buf);
    let textDecoder = util.TextDecoder.create("utf-8");
    return textDecoder.decodeWithStream(msgArray)
  }
  startHeart(address:string,port:number){
     setInterval(()=>{
       if(bindSuccess){
          let remoteAddress:socket.NetAddress = { address: address, port: port, family: 1 }
          udpSocket.send({ data: '心跳', address: remoteAddress })
            .then(async () => {
              console.log('心跳')
              // this.msgHistory += "我:" +'心跳' + await getCurrentTimeString() + "\r\n"
            })
            .catch((e:BusinessError) => {
              console.log('发送失败')
              // this.msgHistory += '发送失败' + e.message + "\r\n";
            })
       }
    },3000)
  }

  /**
   * 绑定地址端口
   * @param address:服务器ip
   * @returns prot:端口号
   */
  async bind2Port(address:string,prot:number) {
    // await udpSocket.close()
    //   .then(() => {
    //     // this.bindSuccess= true
    //     console.log('注销成功');
    //   }).catch((err: BusinessError) => {
    //     console.log('注销失败');
    //   });
    //本地地址
    let localAddress:socket.NetAddress = { address: address, port: prot, family: 1 }
    await udpSocket.bind(localAddress)
      .then(() => {
        bindSuccess = true
        console.log('连接成功')
      })
      .catch((e:BusinessError) => {
        console.log('连接失败')
      })
    //收到消息时的处理
    udpSocket.on("message", async (value:socket.SocketMessageInfo)=> {
      // 发送的消息
      let msg = this.buf2String(value.message)
      // ip
      let remoteIP:string = value.remoteInfo.address
      //端口
      let remotePort:string = value.remoteInfo.port.toString()
      //对端ip地址和端口的字符串形式
      let remoteAddr:string = "[" + remoteIP + ":" + remotePort + "]:"
      let msgHistory:string =  remoteAddr + msg  + "\r\n"
      console.log('接收的消息:',msgHistory)
      return msgHistory
    })

  }
  /**
   * 发送消息
   * @param sendMsg:需要发送的消息
   * @param address:服务器ip
   * @param prot:   端口号
   */
  sendMsg2Target(sendMsg:string,address:string,prot:number) {
    //目的ip和端口
    let remoteAddress:socket.NetAddress = { address: address, port: prot, family: 1 }
    udpSocket.send({ data: sendMsg, address: remoteAddress })
      .then(async () => {
        console.log('发送的消息:',sendMsg)
      })
      .catch((e:BusinessError) => {
        console.log('发送失败:',e.message)
      })
  }
}

二.使用

TypeScript 复制代码
  this.UDPUtils.bind2Port("0.0.0.0",9990)
    // 心跳
   this.UDPUtils.startHeart("0.0.0.0",9990)
相关推荐
严谨的麻辣烫21 小时前
数据中心出口与住宅出口的技术差异:从 ASN 到 TCP 行为的一次拆解
网络·网络协议·tcp/ip
Freed&21 小时前
Zabbix TCP连接状态自定义监控完整部署手册
网络·tcp/ip·zabbix
学着改变27521 小时前
手持式超声波流量计为何首选行澳科技?便携巡检与外夹计量的性能标杆
大数据·网络·人工智能·科技·产品运营·量子计算
2501_915921431 天前
抓包鹰 Traceeagle 解除证书绑定,SSL Pinning 解除
网络·网络协议·网络安全·ios·adb·https·ssl
Lucky_Turtle1 天前
【SSL】letsencrypt域名证书申请,Cloudflare域名
网络·网络协议·ssl
路由侠内网穿透1 天前
本地部署企业级快速开发平台芋道管理后台并实现外部访问
运维·服务器·网络·网络协议
basketball6161 天前
软考中级网络工程师 第4章 无线通信网 备考总结
linux·服务器·网络·网络工程师·软考
睡一觉就好了。1 天前
Linux 信号机制
linux·运维·网络
A_humble_scholar1 天前
Linux(二) C++ TCP/UDP网络编程
linux·网络·c++
Sylvia33.1 天前
篮球数据API的技术架构与工程实践:基于火星数据WebSocket实时推送体系
java·python·websocket·网络协议·架构