需要使用socket通信,现在用HarmonyOS无法解析消息

需要使用socket通信,现在用HarmonyOS无法解析消息

HarmonyOS
2024-05-10 18:13:31
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
cbaby

官方Socket文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/socket-connection-0000001774280322

import socket from ‘@ohos.net.socket’; 
import { BusinessError } from ‘@ohos.base’; 
import util from ‘@ohos.util’; 
import { TAG } from ‘…/…/entryability/EntryAbility’; 
 
class SocketInfo { 
  message: ArrayBuffer = new ArrayBuffer(1); 
  remoteInfo: socket.SocketRemoteInfo = {} as socket.SocketRemoteInfo; 
} 
 
// 同步序列号 
let hasSync = false 
let syncNo = new Uint8Array(4) 
let mask = 0xb0100000 
 
let textEncoder = new util.TextEncoder(‘utf-8’); 
let textDecoder = util.TextDecoder.create(‘utf-8’, { 
  fatal: true, 
  ignoreBOM: true 
}); 
function encode(message: string, c: number): ArrayBuffer { 
// 版本信息 
let version = new Uint8Array(1) 
// 标记位 
let flag = new Uint8Array(1) 
// 命令码 
let cmd = new Uint8Array(2) 
// 消息长度 
let len = new Uint8Array(4) 
// 消息 
let content = textEncoder.encodeInto(message) 
 
version[0] = 1 
flag[0] = 0 
cmd[1] = c >> 8 
cmd[0] = c & 0xff 
 
let n = content.length 
console.info(‘API10DemoTest’, n) 
for (let i = 0; i < len.length; i++) { 
len[i] = n & 0xff 
n = n >> 8 
} 
 
let ans = new Uint8Array(1) 
if (hasSync) { 
  ans = new Uint8Array(version.length + flag.length + syncNo.length + cmd.length + len.length + content.length) 
} else { 
  ans = new Uint8Array(version.length + flag.length + cmd.length + len.length + content.length) 
} 
 
let offset = 0 
ans.set(version, offset) 
offset += version.length 
ans.set(flag, offset) 
offset += flag.length 
if (hasSync) { 
  ans.set(syncNo, offset) 
  offset += syncNo.length 
} 
ans.set(cmd, offset) 
offset += cmd.length 
ans.set(len, offset) 
offset += len.length 
ans.set(content, offset) 
 
return ans.buffer 
} 
function decode(message: SocketInfo): string { 
  let buffer = new Uint8Array(message.message) 
 
  let start = 0 
  // 版本信息 
  let version = buffer.slice(start, start + 1) 
  start += version.length 
  // 标记位 
  let flag = buffer.slice(start, start + 1) 
  start += flag.byteLength 
 
  hasSync = (flag[0] & mask) != 0 
  if (hasSync) { 
    // 同步序列号 
    syncNo = buffer.slice(start, start + 4) 
    start += syncNo.length 
  } 
 
  // 命令码 
  let cmd = buffer.slice(start, start + 2) 
  start += cmd.length 
  // 消息长度 
  let len = buffer.slice(start, start + 4) 
  start += len.length 
  // 消息 
  return textDecoder.decodeWithStream(buffer.slice(start), { stream: false }) 
} 
 
参考以上代码,做编解码操作
分享
微博
QQ
微信
回复
2024-05-11 10:24:03
相关问题
HarmonyOS应用开发需要使用的技术
4979浏览 • 1回复 待解决
HarmonyOS 经典蓝牙的socket通信问题
260浏览 • 1回复 待解决
什么场景下需要使用到多个UIAbility
1747浏览 • 1回复 待解决
元服务包名命名需要使用什么格式
1524浏览 • 1回复 待解决
原生与webview消息通信
140浏览 • 1回复 待解决
需要web组件JSBridge通信的demo
150浏览 • 1回复 待解决
需要提供c++到js通信demo
534浏览 • 1回复 待解决
HarmonyOS使用json解析报错
851浏览 • 2回复 待解决
HarmonyOS Jsons解析的对象无法调用防范
435浏览 • 1回复 待解决
ets TCPSocket连接无法发送消息
3830浏览 • 1回复 待解决
HarmonyOS 消息通知使用示例demo
217浏览 • 1回复 待解决