HarmonyOS 鸿蒙Next:arkts 语言,如何调用socket,发送二进制信息?请帮我写一个tcp协议,socket发送二进制信息的代码例子。

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

HarmonyOS 鸿蒙Next:arkts 语言,如何调用socket,发送二进制信息?请帮我写一个tcp协议,socket发送二进制信息的代码例子。

arkts 语言,查找了很多文档,找到的socket.send发送的都是string信息,实在不知道如何发送二进制信息。希望大神指教。 socket发送二进制信息,循环分开发送大文件的例子。谢谢!我熬了三四天了,我要坚持不下去了。盼高手给我指点迷津!

11 回复
多个思路:将二进制转换成Base64字符串,然后传送;就是多两步编码、解码,任何二进制数组都能当成字符串处理了。

你好,请问一下我使用的是arkts语言。现在我想实现二进制转换成Base64. 但是第一步就卡住了。 import {Base64} from ‘@system.util’; 这个system.util 编译器说找不到模块,请指导一下如何处理

得看你开发应用所用SDK是HOS还是OH,另外是哪个版本,这样才好根据文档确认为何找不到;有些开发者开发用OH SDK,文档看的是HOS SDK,两个SDK有差异可能会导致导入不匹配情况。

楼主说的这个功能需要客户端和服务端配合完成,仓颉api9应该是支持这个功能的。

在tcp的send方法中,需要传递TCPSendOptions类型的参数,这个类型的data属性是支持ArrayBuffer类型的,也就是可以把文件读取出来转化为这个类型再调用send。

大体思路可以这么来处理:

服务端和客户端约定文件数据发送格式:前2个字节表示文件的名称长度,然后是文件名称,紧接着4个字节是文件内容长度,然后是文件内容,格式示意图如下:

[2字节文件名称长度][文件名称][4字节文件内容长度][文件内容]

其中,数据格式的各个部分都使用ArrayBuffer类型表示。

客户端按照这个格式发送,文件内容部分如果比较大,可以分多次发送,比如每次不超过8k。

服务端接收时,按照这个格式接收,首先存到某个缓存中,然后判断是否接收到完整的数据格式,直到完整接收再进行解析即可。

以后有时间我会写个示例,暂时可以参考下面的tcp示例:

鸿蒙网络编程系列3-TCP客户端通讯示例

鸿蒙网络编程系列4-实现Smtp邮件发送客户端

鸿蒙网络编程系列5-TCP连接超时分析

鸿蒙网络编程系列6-TCP数据粘包表现及原因分析

您说得很对,在程序中我已经写代码 ,向服务器传输了filesize表示文件大小。现在这段代码要实现传输文件内容,请帮我修改一下,主要就是tcpsocket那一行如何书写,谢谢您! 代码如下:

let file = fs.openSync(file_path, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
  let buffSize: number = 4096;
  let buffer: ArrayBuffer = new ArrayBuffer(buffSize);

  let off: number = 0; // 记录读取位置的偏移(相较于文件起始偏移)
  let len: number = 0; // 本次读取内容的实际长度
  let readedLen: number = 0; // 记录已读文件长度
  while (len = fs.readSync(file.fd, buffer,{ length: buffSize })) {
    readedLen += len;
    tcpSocket.send({ data: new Uint8Array(5).buffer })
    off = off + len;
    if ((filesize - readedLen) < buffSize) {
      buffSize = filesize - readedLen;
    }
  }

试试这样: tcpSocket.send({ data: buffer.slice(0,len)}) 我也没有调试,拍脑袋拍的

你试着发工单直接问华为那边呢,论坛里开发者们着重点不一样,你的问题很多人没法解答。就像我要搞vpn相关的东西,next文档里vpn那块的示例我都没怎么看懂

老哥,话说鸿蒙vpn 部分api在哪啊,方便转一下链接嘛,我找了半天都只有开关第三方vpn 的api,没有找到类似安卓api中创建vpn,添加路由,dns的api

就是那块啊,所以说我没看懂,而且指南和api参考里,其他网络部分都有示例,就vpn这块的没有,我发了工单问了官方,他们给的回复是参照oh那边的vpn示例 https://gitee.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/Connectivity/VPN

我看send参数支持ArrayBuffer,应该是支持的,使用UInt8Array传一下试试。

        let buf =new Uint8Array(5).buffer
        let socketInstance = socket.constructTCPSocketInstance()
        let op:socket.TCPSendOptions = {
          data:buf
        }
        socketInstance.send(op)<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

在HarmonyOS鸿蒙系统中使用ArkTS语言进行Socket编程时,可以通过ArkUI框架的扩展能力调用原生Java或C++代码来实现TCP协议的Socket通信。由于ArkTS本身是基于TypeScript的扩展,直接操作底层网络API较为受限,通常需要通过JSI(JavaScript Interface)与原生代码交互。

以下是一个简化的示例,展示如何通过ArkTS调用原生Java代码发送二进制信息。请注意,实际实现需根据具体项目结构和依赖进行调整。

ArkTS代码(假设已集成JSI)

import { callNative } from '@ohos.ability.native';

function sendBinaryData(host: string, port: number, data: ArrayBuffer) {
    callNative('sendBinaryOverSocket', { host, port, data: Array.from(new Uint8Array(data)) });
}

// 使用示例
const binaryData = new ArrayBuffer(4);
const dataView = new DataView(binaryData);
dataView.setUint32(0, 12345678);
sendBinaryData('127.0.0.1', 8080, binaryData);

对应Java代码(需自行实现并注册JSI接口)

Java部分负责实际的Socket通信,包括创建Socket、连接服务器、发送数据等。具体实现需根据Java的Socket编程规范进行。

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

回到顶部