Harmony-websocket(一)

websocket(确认过眼神,就是朋友了)

定义:

是一种网络通信协议,用于在客户端和服务器之间建立持久、双向的实时通信连接,适用于实时交互的应用场景。

特点:

  • 双向通信:WebSocket允许服务器和客户端之间进行双向通信;
  • 持久连接:一旦连接成功,WebSocket会保持连接状态,直到一方主动断开连接(相对于Http请求,减少了频繁建立和关闭连接的开销);
  • 基于TCP:数据传输的可靠性;
  • 低延迟:数据可以在连接上可以快速传输,无需每次都建立新的连接。

使用:

  1. 创建WebSocket对象:createWebSocket()方法
  2. 和服务器建立连接:connect()方法
  3. 检测是否连接成功:on('open')事件的回调
  4. 连接成功后,接收服务器发送的信息:on('message')事件的回调,发信息给服务器send()
  5. 不用时,断开连接:close(),注意断开后,相关的websocket对象也会被销毁
typescript 复制代码
import { webSocket } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';


let defaultIpAddress = "ws://";

// 第一步:创建websocket通讯的对象
let ws = webSocket.createWebSocket();

// 第二步:连接服务器
ws.connect(defaultIpAddress, (err: BusinessError, value: boolean) => {
  if (!err) {
    console.log("Connected successfully");
  } else {
    console.log("Connection failed. Err:" + JSON.stringify(err));
  }
});
// 第三步检测是否与服务器连接成功:on('open')事件的回调
ws.on('open', (err: BusinessError, value: Object) => {
  console.log("on open, status:" + JSON.stringify(value));
  // 第四步:收到on('open')事件时,就可以通过send()方法与服务器进行通信
  ws.send("Hello, server!", (err: BusinessError, value: boolean) => {
    if (!err) {
      console.log("Message send successfully");
    } else {
      console.log("Failed to send the message. Err:" + JSON.stringify(err));
    }
  });
});

// 第四步:接收服务器发送的信息
ws.on('message', (err: BusinessError, value: string) => {
  console.log("on message, message:" + value);
  
});

// 第五步:不用时,断开
ws.on('close', (err: BusinessError, value: webSocket.CloseResult) => {
  console.log("on close, code is " + value.code + ", reason is " + value.reason);
});

// 错误事件处理
ws.on('error', (err: BusinessError) => {
  console.log("on error, error:" + JSON.stringify(err));
});

心跳检测机制

概念:

在客户端和服务端建立WebSocket连接之后,每间隔30秒客户端会发送Ping帧给服务器,服务器收到后会立即回复Pong帧

bug以及处理方法

  1. 切换到后台的时候,WebSocket会断开连接??? 答:无长时任务的应用退到后台,大概15s会主动断开WebSocket连接或者系统强制断开TCP连接(有长时任务大概会60s左右断开),故我们需要应用切换到前台时,重新创建连接。可以在EntryAbility文件的onForeground()中重新连接。 第二个方法:采用Push Kit。应用在后台的时候,将接收并缓存该时段的所有信息,达到websocket在后台保活的效果(从后台功耗管控策略角度考虑,不建议)
  2. websocket连接上就断开了??? 答:鸿蒙的底层有心跳检测机制,但是如果连接成功后,30s内不进行send(),那么底层会强制断开长连接;执行send()后就会一直保持长连接了。

后续有问题会及时补充上嘟

相关推荐
nashane10 小时前
HarmonyOS 6学习:CapsLock键失效诊断与长截图完整实现指南
学习·华为·harmonyos
richard_yuu12 小时前
鸿蒙心理测评模块实战|PHQ-9/GAD7双量表答题、实时计分与结果本地化存储
华为·harmonyos
不爱吃糖的程序媛15 小时前
2026年Electron 鸿蒙PC环境搭建指南
人工智能·华为·harmonyos
nashane15 小时前
HarmonyOS 6学习:长截图功能开发中的滚动拼接与权限处理实战
人工智能·华为·harmonyos
大师兄666816 小时前
从零开发一个 HarmonyOS 输入法——KikaInputMethod 完整拆解
harmonyos·服务卡片·harmonyos6·formkit
Python私教21 小时前
鸿蒙 NEXT 也能接 MCP?用 ArkTS 跑通 AI Agent 工具链
人工智能·华为·harmonyos
Swift社区1 天前
分布式能力在鸿蒙 PC 上到底怎么用?
分布式·华为·harmonyos
nashane1 天前
HarmonyOS 6学习:外接键盘CapsLock与长截图功能的实战调试与完整解决方案
学习·华为·计算机外设·harmonyos
aqi002 天前
一文理清 HarmonyOS 6.0.2 涵盖的十个升级点
android·华为·harmonyos·鸿蒙·harmony