鸿蒙 Tcp/Udp 发送单播 广播 多播
·
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(通用即插即用) 协议的一部分,用于在局域网中自动发现和连接设备。
更多推荐

所有评论(0)