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

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

相关推荐
三掌柜6662 分钟前
HarmonyOS开发:显示图片功能详解
华为·harmonyos
二蛋和他的大花2 分钟前
HarmonyOS运动语音开发:如何让运动开始时的语音播报更温暖
华为·harmonyos
空潭冷月1 小时前
HarmonyOS5:鸿蒙旅游类应用开发实践
harmonyos
空潭冷月1 小时前
HarmonyOS5:鸿蒙体育类应用开发实践
harmonyos
全栈若城1 小时前
71.[HarmonyOS NEXT 实战案例十] 电子书网格布局(上)
harmonyos
全栈若城1 小时前
85.[HarmonyOS NEXT 实战案例十七] 设置选项列表网格布局(下)
harmonyos
全栈若城1 小时前
73.[HarmonyOS NEXT 实战案例十一] 智能家居控制面板网格布局(上)
harmonyos
半路下车5 小时前
【Harmony OS 5】HarmonyOS应用测试指南
设计模式·harmonyos
移动端开发者5 小时前
鸿蒙Next自定义双滑块滑动条实现方案
harmonyos