HarmonyOS鸿蒙Next中怎么使用socket连接进行组播通信,发送消息、接收消息
HarmonyOS鸿蒙Next中怎么使用socket连接进行组播通信,发送消息、接收消息 我想通过socket来创建组播进行多设备之间的相互通信,但是第一次用socket,有没有大佬指点一下
import { socket } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';
const MULTICAST_ADDRESS: string = '239.255.255.250';
const MULTICAST_PORT = 12345;
@Component
struct SocketTestPage {
@State message: string = 'SocketTestPage';
socketInfo: SocketInfo = new SocketInfo()
tcpServer: socket.TCPSocketServer = socket.constructTCPSocketServerInstance();
multicastSocket: socket.MulticastSocket = socket.constructMulticastSocketInstance()
createTcpServer(address: string) {
let ipAddress: socket.NetAddress = {} as socket.NetAddress;
ipAddress.address = address
ipAddress.port = 4651;
this.tcpServer.listen(ipAddress).then(() => {
console.log('listen success');
AlertDialog.show({ message: JSON.stringify('listen success', null, 2) })
}).catch((err: BusinessError) => {
console.error('listen fail');
AlertDialog.show({ message: JSON.stringify('listen fail', null, 2) })
});
this.tcpServer.getState()
}
addMulticast(address: string) {
let addr: socket.NetAddress = {
address: address,
port: 8080
}
this.multicastSocket.addMembership(addr, (err: Object) => {
if (err) {
console.error('add membership fail, err: ' + JSON.stringify(err));
AlertDialog.show({ message: 'add membership fail, err: ' + JSON.stringify(err) })
return;
}
console.log('add membership success');
AlertDialog.show({ message: JSON.stringify('add membership success', null, 2) })
})
}
aaa(address: string) {
this.multicastSocket.bind({ address: '0.0.0.0', port: MULTICAST_PORT }, () => {
this.multicastSocket.send({ data: 'dasdasda', address: { address: '' } }, () => {
AlertDialog.show({ message: JSON.stringify('发送成功', null, 2) })
})
})
}
build() {
Column() {
Button('创建TCPSocket连接').onClick((event: ClickEvent) => {
this.createTcpServer("192.168.128.235")
})
Button('创建TCPSocket连接').onClick((event: ClickEvent) => {
this.createTcpServer("192.168.128.238")
})
Button('创建TCPSocket连接-电脑').onClick((event: ClickEvent) => {
this.createTcpServer("192.168.20.116")
})
Button('订阅TCPSocketServer的connect事件').onClick((event: ClickEvent) => {
this.listenConnect()
})
Button('加入多播组1').onClick((event: ClickEvent) => {
this.addMulticast('192.168.128.235')
})
Button('加入多播组2').onClick((event: ClickEvent) => {
this.addMulticast('192.168.128.238')
})
Button('加入多播组-电脑').onClick((event: ClickEvent) => {
this.addMulticast('192.168.20.116')
})
}
.height('100%')
.width('100%')
}
listenConnect() {
// 订阅TCPSocketServer的connect事件,客户端与服务端建立连接后,返回一个TCPSocketConnection对象,用于与客户端通信。
this.tcpServer.on("connect", (client: socket.TCPSocketConnection) => {
// client即为建立连接后获取到的连接对象,可以通过该对象订阅TCPSocketConnection相关的事件。
AlertDialog.show({ message: JSON.stringify('connect', null, 2) })
client.on("close", () => {
console.log("on close success");
AlertDialog.show({ message: JSON.stringify("on close success", null, 2) })
});
client.on("message", (value: SocketInfo) => {
let buffer = value.message;
let dataView = new DataView(buffer);
let str = "";
for (let i = 0; i < dataView.byteLength; ++i) {
str += String.fromCharCode(dataView.getUint8(i));
}
AlertDialog.show({ message: JSON.stringify(value, null, 2) })
console.log("received message--:" + str);
console.log("received address--:" + value.remoteInfo.address);
console.log("received family--:" + value.remoteInfo.family);
console.log("received port--:" + value.remoteInfo.port);
console.log("received size--:" + value.remoteInfo.size);
});
// 向客户端发送数据。
let tcpSendOptions: socket.TCPSendOptions = {} as socket.TCPSendOptions;
tcpSendOptions.data = 'Hello, client!';
client.send(tcpSendOptions).then(() => {
console.log('send success');
}).catch((err: Object) => {
console.error('send fail: ' + JSON.stringify(err));
});
// 关闭与客户端的连接。
client.close().then(() => {
console.log('close success');
}).catch((err: BusinessError) => {
console.error('close fail');
});
// 取消TCPSocketConnection相关的事件订阅。
setTimeout(() => {
client.off("message");
client.off("close");
}, 10 * 1000);
});
}
}
class SocketInfo {
message: ArrayBuffer = new ArrayBuffer(1);
remoteInfo: socket.SocketRemoteInfo = {} as socket.SocketRemoteInfo;
}
class ccc {
playerId: number = 0
status: string = 'aaa'
}
更多关于HarmonyOS鸿蒙Next中怎么使用socket连接进行组播通信,发送消息、接收消息的实战教程也可以访问 https://www.itying.com/category-93-b0.html
2 回复
在HarmonyOS Next中,使用socket进行组播通信需要创建DatagramSocket。发送组播消息时,需设置组播地址(224.0.0.0~239.255.255.255)和端口,调用send()方法。接收消息时,需绑定端口并加入组播组,通过receive()接收数据。关键步骤包括:创建socket、设置组播TTL、加入/离开组播组。注意使用ohos.net.socket和ohos.net.connection接口。
更多关于HarmonyOS鸿蒙Next中怎么使用socket连接进行组播通信,发送消息、接收消息的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中使用Socket进行组播通信,主要涉及MulticastSocket的使用。根据你的代码,我整理出组播通信的关键实现步骤:
- 创建MulticastSocket实例:
multicastSocket: socket.MulticastSocket = socket.constructMulticastSocketInstance()
- 绑定本地地址和端口(接收消息前必须绑定):
this.multicastSocket.bind({ address: '0.0.0.0', port: MULTICAST_PORT }, () => {
console.log('bind success');
});
- 加入组播组:
let addr: socket.NetAddress = {
address: MULTICAST_ADDRESS, // 组播地址(224.0.0.0~239.255.255.255)
port: MULTICAST_PORT
}
this.multicastSocket.addMembership(addr, (err) => {
if (err) {
console.error('addMembership fail');
return;
}
console.log('addMembership success');
});
- 发送组播消息:
let sendOptions = {
data: '组播消息内容',
address: {
address: MULTICAST_ADDRESS,
port: MULTICAST_PORT
}
};
this.multicastSocket.send(sendOptions, (err) => {
if (err) {
console.error('send fail');
return;
}
console.log('send success');
});
- 接收组播消息(需要先设置消息监听):
this.multicastSocket.on('message', (data: socket.SocketMessageInfo) => {
let buffer = data.message;
// 处理接收到的数据
console.log('received multicast message');
});
注意事项:
- 组播地址范围是224.0.0.0到239.255.255.255
- 发送和接收需要使用相同的组播地址和端口
- 设备需要连接到同一局域网
- 记得在不需要时调用close()释放资源
你的代码中已经包含了大部分关键实现,主要需要确保组播地址和端口配置正确,以及正确处理消息收发回调。