HarmonyOS 鸿蒙Next 电脑端的server是用 C++ 写的,如何与它进行TCP 通信?

发布于 1周前 作者 yuanlaile 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 电脑端的server是用 C++ 写的,如何与它进行TCP 通信?

电脑端的server是用 C++ 写的。

它要求发送的每个数据包前面,附加13 个字节的头,具体定义如下:

#pragma pack(1)

struct  Header

{

    char  flag; //  1个字节。 

    int  size; // 整个数据包的长度 ,4个字节

    unsigned  long  sequence; // 流水号,4个字节

    int type; // 数据包的类型 ,4个字节。 

};

该Header占用的字节数 = 1 + 4 + 4  + 4 = 13 字节。

我的问题有2个:

1、在ArkTS 中,如何定义有精确字节数的Header ? 以及如何给每个成员赋值 ?

2、如何把要发送的数据转换成 ArrayBuffer , 以便传给 tcp.send . 


更多关于HarmonyOS 鸿蒙Next 电脑端的server是用 C++ 写的,如何与它进行TCP 通信?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

第一个问题:使用 ArrayBuffer 和 DataView 来定义和操作 13 字节的 Header 结构:

class Header {
  private buffer: ArrayBuffer;
  private view: DataView;

  constructor(flag: number, size: number, sequence: number, type: number) {
    this.buffer = new ArrayBuffer(13); // 分配13个字节
    this.view = new DataView(this.buffer);

    // 赋值
    this.view.setUint8(0, flag);                   // 1个字节
    this.view.setInt32(1, size, true);             // 整个数据包的长度,4个字节,little-endian
    this.view.setUint32(5, sequence, true);        // 流水号,4个字节,little-endian
    this.view.setInt32(9, type, true);             // 数据包的类型,4个字节,little-endian
  }

  // 获取ArrayBuffer
  getBuffer(): ArrayBuffer {
    return this.buffer;
  }

  // 打印Header的内容
  print(): void {
    console.log(`flag: ${this.view.getUint8(0)}`);
    console.log(`size: ${this.view.getInt32(1, true)}`);
    console.log(`sequence: ${this.view.getUint32(5, true)}`);
    console.log(`type: ${this.view.getInt32(9, true)}`);
  }
}

第二个问题:sendDataWithHeader 函数:将 Header 和数据合并为一个 ArrayBuffer,然后通过 tcpSendFunction 发送。

function sendDataWithHeader(header: Header, data: Uint8Array, tcpSendFunction: (buffer: ArrayBuffer) => void): void {
  const headerBuffer = header.getBuffer();
  const totalLength = headerBuffer.byteLength + data.byteLength;
  const combinedBuffer = new ArrayBuffer(totalLength);
  const combinedView = new Uint8Array(combinedBuffer);

  // 将headerBuffer和data复制到combinedBuffer
  combinedView.set(new Uint8Array(headerBuffer), 0);
  combinedView.set(data, headerBuffer.byteLength);

  // 通过tcpSendFunction发送 combinedBuffer
  tcpSendFunction(combinedBuffer);
}

// 示例:定义要发送的数据和发送函数
const dataToSend = new Uint8Array([/* 你的数据 */]);
const tcpSendFunction = (buffer: ArrayBuffer) => {
  // 在这里实现你的 TCP 发送逻辑
  console.log("Data sent:", buffer);
};


// 创建Header并发送数据
const header = new Header(1, 1024, 12345678, 2);
sendDataWithHeader(header, dataToSend, tcpSendFunction);

对于你说的场景,其实还可以使用native开发,在Native c++侧编写代码进行TCP 通信,ArkTs只需要简单处理一下结果就可以了。NDK参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ndk-development-overview-V5

更多关于HarmonyOS 鸿蒙Next 电脑端的server是用 C++ 写的,如何与它进行TCP 通信?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


与HarmonyOS鸿蒙Next电脑端的server(用C++编写)进行TCP通信,你需要按照以下步骤操作:

  1. 确定服务器信息:首先,你需要知道服务器的IP地址和端口号,这是建立TCP连接的基础。

  2. 客户端开发:在客户端(可以是任何支持TCP通信的设备或软件),你需要使用支持TCP协议的库或框架来创建TCP连接。例如,在多数编程语言中,如Python、C#、Java(尽管题目要求不提及,但为说明通用性提及,实际在鸿蒙环境中不采用)等,都有内置的库来处理TCP连接。

  3. 建立连接:使用上述库提供的函数或方法,指定服务器的IP地址和端口号,尝试建立TCP连接。

  4. 数据交换:一旦连接建立,你可以通过连接发送和接收数据。这通常涉及将数据转换为字节流,并通过连接发送;接收时,将字节流转换回原始数据类型。

  5. 关闭连接:完成通信后,确保正确关闭TCP连接,以释放资源。

在鸿蒙环境中,你可以使用系统提供的网络库或第三方库来实现上述功能。确保你的鸿蒙设备具有网络连接权限,并正确配置防火墙等安全设置。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部