tcp需要三次握手建立连接 ,udp不需要连接可以直接给指定IP发送数据,tcp发送的是包数据是流 内容不是完整独立的,可靠的,有校验和重发机制 响应慢,udp发送的是报文,是独立的有边界的,不可靠,无校验和重发,响应快(实时要求高的基于此协议),比如三个包 (1k、2k、3K),tcp一次性发送1.5k的流6k需要发送4次,udp的就可以一次发一个包3次,每次发一个独立的包。如此tcp可能出现粘包,udp可能出现丢包。

tcp 建立连接后一对一收发数据,udp可以单播 广播 多播(组播),

单播就是指定IP 收发数据,广播就是局域网内发送给网内所有对象,多播就是加入一个组 组内成员广播,

  • 单播‌:用于一对一通信,IP范围广但不包括特定保留或私有地址。
  • 广播‌:特定于子网,通常是子网内的最后一个IP地址。(例如255.255.255.255)
  • 组播‌:用于一对多通信,IP范围从224.0.0.0到239.255.255.255。

 多播代码示例

this.multicast = socket.constructMulticastSocketInstance();
this.multicast.addMembership({ address: "230.230.230.230", port: 8002}, (err) => {
  if (err) {
    console.error('Bind failed:', err);
  } else {
    // 设置TTL(默认1,限制本地网络)大于1可以向上穿透多局域网
    this.multicast.setMulticastTTL(1).then(() => {
      console.info('TTL set');
    });
    // 启用回环模式
    this.multicast.setLoopbackMode(true).then(() => {
      console.info('Loopback enabled');
    });

    this.multicast.on('message', (value: socket.SocketMessageInfo) => {
      // const message = new TextDecoder().decode(data.message);
      // console.info('Received multicast:', message);
    });
    // this.startPolling()   循环发送数据
  }
})

广播示例

this.udp = socket.constructUDPSocketInstance();
// 0.0.0.0 接收所有地址广播  也可以设置成自己实际的IP
this.udp.bind({ address: '0.0.0.0',port: 8888}, (err: BusinessError) => {
  this.udp.setExtraOptions({
    broadcast: true, //需在bind后设置
  }).then(() => {
   let netAddress: socket.NetAddress = {
      address: '255.255.255.255', // 对全网广播
      port: 8888   //如果此端口和前面bind的端口保持一致 可以实现广播自己也能收到
    }
   let sendOptions: socket.UDPSendOptions = {
      data: this.sendData.buffer,
      address: netAddress
    }
this.udp.on('message', (value: socket.SocketMessageInfo) => {
  let decoder = util.TextDecoder.create('utf-8');
  let msg:string = decoder.decodeToString(new Uint8Array(value.message));
});

this.udp.send(sendOptions, (err: BusinessError) => {
  if (err) {
    console.error('aaaasend fail' + JSON.stringify(err));
    return;
  }
  console.info('aaaasend success');
});
})

239.255.255.250 是一个‌组播地址‌,主要用于 ‌SSDP(简单服务发现协议)‌和 ONVIF 协议,支持局域网内设备自动识别与通信。‌‌,SSDP是 ‌UPnP(通用即插即用)‌ 协议的一部分,用于在局域网中自动发现和连接设备‌。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐