需要使用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应用开发需要使用的技术
3668浏览 • 1回复 待解决
元服务包名命名需要使用什么格式
410浏览 • 1回复 待解决
什么场景下需要使用到多个UIAbility
684浏览 • 1回复 待解决
HarmonyOS是否支持消息推送?
462浏览 • 1回复 待解决
ets TCPSocket连接无法发送消息
2206浏览 • 1回复 待解决
需要提供c++到js通信demo
299浏览 • 1回复 待解决
调用其他用户程序要使用哪个 API?
496浏览 • 1回复 待解决
请问现在harmonyOS有屏幕适配方案吗?
2281浏览 • 1回复 待解决
OpenharmonyOS 如何使用串口通信
2845浏览 • 1回复 待解决
ohos.net.socket (Socket连接)链接不上
3860浏览 • 1回复 待解决
请问接入HarmonyOS需要学习什么新技能?
4220浏览 • 1回复 已解决