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()后就会一直保持长连接了。

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

相关推荐
youyin15 小时前
HarmonyOS ArkUI 组件与自定义组件零基础:从搭页面到组件化开发
华为·harmonyos
HwJack2018 小时前
【HarmonyOS开发小实践】ArkTS 从 TypeScript 到方舟语言的演进
华为·harmonyos
威哥爱编程21 小时前
HarmonyOS 7 星盾机密风控实战:设备风险因子端侧融合计算,可用不可见
harmonyos·arkts
威哥爱编程1 天前
HarmonyOS 7 应用快启实战:关键资源预加载进内存,冷启告别白屏
华为·harmonyos·arkts
马剑威(威哥爱编程)1 天前
【共创稿事节】HarmonyOS 7 视觉 AI 进阶实战:人脸检测 + 通用文字识别(OCR)两步接入
华为·harmonyos·arkts
HMS Core1 天前
HarmonyOS智慧多窗,让应用在任意窗口都“恰到好处”
harmonyos
梦想不只是梦与想1 天前
鸿蒙 应用发布准备工作(一)
harmonyos·鸿蒙上架·鸿蒙应用发布
马剑威(威哥爱编程)2 天前
【共创稿事节】HarmonyOS 7 文搜图实战:自然语言检索本地图片,全流程端侧闭环
华为·harmonyos
李游Leo2 天前
HarmonyOS 7 HAR + HSP 工程化实战:模块复用、包体积控制与依赖边界
harmonyos