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的使用。根据你的代码,我整理出组播通信的关键实现步骤:

  1. 创建MulticastSocket实例:
multicastSocket: socket.MulticastSocket = socket.constructMulticastSocketInstance()
  1. 绑定本地地址和端口(接收消息前必须绑定):
this.multicastSocket.bind({ address: '0.0.0.0', port: MULTICAST_PORT }, () => {
  console.log('bind success');
});
  1. 加入组播组:
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');
});
  1. 发送组播消息:
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');
});
  1. 接收组播消息(需要先设置消息监听):
this.multicastSocket.on('message', (data: socket.SocketMessageInfo) => {
  let buffer = data.message;
  // 处理接收到的数据
  console.log('received multicast message');
});

注意事项:

  1. 组播地址范围是224.0.0.0到239.255.255.255
  2. 发送和接收需要使用相同的组播地址和端口
  3. 设备需要连接到同一局域网
  4. 记得在不需要时调用close()释放资源

你的代码中已经包含了大部分关键实现,主要需要确保组播地址和端口配置正确,以及正确处理消息收发回调。

回到顶部