let udpExtraOptions: socket.UDPExtraOptions = {
receiveBufferSize: 8192,
sendBufferSize: 8192,
reuseAddress: false,
socketTimeout: 6000,
broadcast: true // 开启广播
};
this.udpClient.bind({ address: '0.0.0.0', port: 8000, family: 1 } as socket.NetAddress, (error: Error) => {
if (error) {
console.error(`udp client bind fail: ${JSON.stringify(error)}`);
return;
}
// 注意setExtraOptions需要在bind成功之后设置
this.udpClient.setExtraOptions(udpExtraOptions, (err: BusinessError) => {
if (err) {
console.error(`setExtraOptions fail: ${JSON.stringify(err)}`);
return;
}
console.info('setExtraOptions success');
});
this.bindSocket2BearType(this.udpClient, connection.NetBearType.BEARER_WIFI);
}); bindSocket2BearType(socketParam: socket.TCPSocket | socket.UDPSocket, bearType: connection.NetBearType) {
if (!bearType) {
return;
}
let netHandle: connection.NetHandle | undefined = undefined;
connection.getAllNets((error: BusinessError, netHandles: connection.NetHandle[]) => {
if (error) {
console.error(`getAllNets failed: ${JSON.stringify(error)}`);
}
for (let index = 0; index < netHandles.length; index++) {
try {
let data = connection.getNetCapabilitiesSync(netHandles[index]);
console.info(`Succeeded to get data: ${JSON.stringify(data)} `);
if (bearType === data.bearerTypes[0]) {
netHandle = netHandles[index];
}
} catch (error) {
console.error(`failed to get net capabilities. Code:${error.code}, message:${error.message}`);
}
}
if (netHandle) {
(netHandle as connection.NetHandle).bindSocket(socketParam, (error: BusinessError, data: void) => {
if (error) {
console.error(`failed to bind socket. Code:${error.code}, message:${error.message}`);
} else {
console.info(`bindSocket success: ${JSON.stringify(data)}`);
}
});
} else {
console.error(`not find netHandle ${bearType}`);
}
});
} let netAddress: socket.NetAddress = {
address: this.broadcastIp, // 广播地址
port: this.broadcastPort
};
let sendOptions: socket.UDPSendOptions = {
data: (new Date()).getTime().toString() + ', Hello, server!',
address: netAddress
};
this.udpClient.send(sendOptions, (err: BusinessError) => {
if (err) {
console.error(`udp client send broadcast fail: ${JSON.stringify(err)}`);
return;
}
console.info('udp client send broadcast success');
}); 包含接收端的完整示例如下:
import { connection, socket } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { util } from '@kit.ArkTS';
@Entry
@Component
struct SocketSendBySpecificNet {
private udpClient: socket.UDPSocket = socket.constructUDPSocketInstance();
private broadcastIp: string = '255.255.255.255'; // 广播地址,可以是子网广播地址比如192.168.43.255或受限广播地址255.255.255.255
private broadcastPort: number = 18256; // 广播包端口,需要双方协商
aboutToAppear(): void {
let udpExtraOptions: socket.UDPExtraOptions = {
receiveBufferSize: 8192,
sendBufferSize: 8192,
reuseAddress: false,
socketTimeout: 6000,
broadcast: true // 开启广播
};
this.udpClient.bind({ address: '0.0.0.0', port: 8000, family: 1 } as socket.NetAddress, (error: Error) => {
if (error) {
console.error(`udp client bind fail: ${JSON.stringify(error)}`);
return;
}
// 注意setExtraOptions需要在bind成功之后设置
this.udpClient.setExtraOptions(udpExtraOptions, (err: BusinessError) => {
if (err) {
console.error(`setExtraOptions fail: ${JSON.stringify(err)}`);
return;
}
console.info('setExtraOptions success');
});
this.bindSocket2BearType(this.udpClient, connection.NetBearType.BEARER_WIFI);
});
}
bindSocket2BearType(socketParam: socket.TCPSocket | socket.UDPSocket, bearType: connection.NetBearType) {
if (!bearType) {
return;
}
let netHandle: connection.NetHandle | undefined = undefined;
connection.getAllNets((error: BusinessError, netHandles: connection.NetHandle[]) => {
if (error) {
console.error(`getAllNets failed: ${JSON.stringify(error)}`);
}
for (let index = 0; index < netHandles.length; index++) {
try {
let data = connection.getNetCapabilitiesSync(netHandles[index]);
console.info(`Succeeded to get data: ${JSON.stringify(data)} `);
if (bearType === data.bearerTypes[0]) {
netHandle = netHandles[index];
}
} catch (error) {
console.error(`failed to get net capabilities. Code:${error.code}, message:${error.message}`);
}
}
if (netHandle) {
(netHandle as connection.NetHandle).bindSocket(socketParam, (error: BusinessError, data: void) => {
if (error) {
console.error(`failed to bind socket. Code:${error.code}, message:${error.message}`);
} else {
console.info(`bindSocket success: ${JSON.stringify(data)}`);
}
});
} else {
console.error(`not find netHandle ${bearType}`);
}
});
}
build() {
Column({ space: 24 }) {
Button('Socket通过特定网络发送广播').onClick(() => {
let netAddress: socket.NetAddress = {
address: this.broadcastIp, // 广播地址
port: this.broadcastPort
};
let sendOptions: socket.UDPSendOptions = {
data: (new Date()).getTime().toString() + ', Hello, server!',
address: netAddress
};
this.udpClient.send(sendOptions, (err: BusinessError) => {
if (err) {
console.error(`udp client send broadcast fail: ${JSON.stringify(err)}`);
return;
}
console.info('udp client send broadcast success');
});
});
Button('接收广播包').onClick(() => {
let udp: socket.UDPSocket = socket.constructUDPSocketInstance();
udp.bind({ address: '0.0.0.0', port: this.broadcastPort, family: 1 } as socket.NetAddress, (error: Error) => {
if (error) {
console.error(`recv client bind fail: ${JSON.stringify(error)}`);
return;
}
udp.on('message', (data: socket.SocketMessageInfo) => {
console.info(`client recv data success: ${JSON.stringify(data)}`);
let decoder = util.TextDecoder.create('utf-8');
let str = decoder.decodeToString(new Uint8Array(data.message));
console.info(`client recv broadcast: ${str}`);
});
});
});
}
.justifyContent(FlexAlign.Center)
.height('100%')
.width('100%');
}
}