鸿蒙应用开发:WebSocket 使用示例

鸿蒙应用开发:WebSocket 使用示例

前言

最近在开发鸿蒙应用时,遇到了需要实现实时通信的需求。经过一番研究,发现鸿蒙 5.0 提供了更完善的 WebSocket 支持,于是就写了个简单的 demo 来测试。下面分享一下我的实现过程,希望能帮到有同样需求的同学。

开发环境

  • DevEco Studio 4.0
  • HarmonyOS SDK API 14(鸿蒙 5.0)
  • 测试设备:华为 Mate 60 Pro

实现过程

1. 先导入需要的包

typescript 复制代码
import { webSocket } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';

2. 写个简单的组件

这里我写了一个简单的组件,主要用来测试 WebSocket 的 ping 功能。鸿蒙 5.0 的组件系统有了很大改进,写起来更顺手了。

typescript 复制代码
@Entry
@Component
struct WebSocketExample {
  @State pingResult: string = '';
  private ws: webSocket.WebSocket | undefined = undefined;
  private pingStartTime: number = 0;
  private pingCount: number = 0;
  private totalPingTime: number = 0;

  // 组件创建时初始化
  aboutToAppear() {
    this.initWebSocket();
  }

  // 组件销毁时记得关闭连接
  aboutToDisappear() {
    this.closeWebSocket();
  }
}

3. 初始化 WebSocket

鸿蒙 5.0 的 WebSocket API 做了不少优化,错误处理更完善了。这部分代码看起来有点长,但其实就是几个事件监听器:

typescript 复制代码
private initWebSocket() {
  // 创建实例
  this.ws = webSocket.createWebSocket();
  
  // 连接成功时的处理
  this.ws.on('open', (err: BusinessError, value: Object) => {
    if (err) {
      console.error('连接失败:', JSON.stringify(err));
      this.pingResult = '连接失败';
      return;
    }
    console.log('连接成功啦!');
  });

  // 收到消息时的处理
  this.ws.on('message', (error: BusinessError, value: string | ArrayBuffer) => {
    if (error) {
      console.error('消息错误:', JSON.stringify(error));
      return;
    }
    
    // 如果是 pong 消息,计算一下延迟
    if (value === 'pong') {
      const endTime = Date.now();
      const duration = endTime - this.pingStartTime;
      this.pingCount++;
      this.totalPingTime += duration;
      const avgPing = this.totalPingTime / this.pingCount;
      this.pingResult = `延迟: ${duration}ms (平均: ${avgPing.toFixed(2)}ms)`;
    }
  });

  // 错误处理
  this.ws.on('error', (err: BusinessError) => {
    console.error('出错了:', JSON.stringify(err));
    this.pingResult = '连接错误';
  });

  // 连接关闭时的处理
  this.ws.on('close', (err: BusinessError, value: webSocket.CloseResult) => {
    console.log(`连接关闭了: ${value.code} - ${value.reason}`);
  });

  // 开始连接服务器
  this.ws.connect('ws://your-server-address', {
    header: {
      'Content-Type': 'application/json'
    },
    // API 14 新增的配置项
    protocols: ['my-protocol'],
    timeout: 10000, // 10秒超时
    proxy: {
      host: '192.168.0.150',
      port: 8888,
      exclusionList: []
    }
  }, (err: BusinessError, value: boolean) => {
    if (err) {
      console.error('连接失败:', JSON.stringify(err));
      this.pingResult = '连接失败';
    }
  });
}

4. 实现 Ping 功能

鸿蒙 5.0 的 WebSocket 发送消息更稳定了,这个功能很简单:

typescript 复制代码
private sendPing() {
  if (!this.ws) {
    this.pingResult = '还没连接呢';
    return;
  }

  this.pingStartTime = Date.now();
  this.ws.send('ping', (err: BusinessError, value: boolean) => {
    if (err) {
      console.error('发送失败:', JSON.stringify(err));
      this.pingResult = '发送失败';
    }
  });
}

5. 关闭连接

API 14 的关闭连接更可靠了:

typescript 复制代码
private closeWebSocket() {
  if (this.ws) {
    this.ws.close((err: BusinessError) => {
      if (err) {
        console.error('关闭失败:', JSON.stringify(err));
      }
    });
  }
}

6. 写个简单的界面

鸿蒙 5.0 的 UI 系统有了很大改进,写起来更顺手了:

typescript 复制代码
build() {
  Column() {
    Button('测试延迟')
      .onClick(() => this.sendPing())
    Text(this.pingResult)
      .fontSize(16)
      .margin({ top: 10 })
  }
  .width('100%')
  .height('100%')
  .justifyContent(FlexAlign.Center)
}

踩过的坑

  1. 刚开始没注意在组件销毁时关闭连接,导致内存泄漏
  2. 错误处理没做好,导致应用崩溃
  3. 连接超时时间设置太短,经常连接失败
  4. 忘记处理重连逻辑,网络不稳定时体验不好
  5. API 14 新增的配置项没用好,导致连接不稳定

总结

这个 demo 虽然简单,但基本覆盖了 WebSocket 的主要功能。鸿蒙 5.0 的 WebSocket API 做了很多改进,使用起来更稳定了。实际项目中可能还需要添加:

  • 自动重连
  • 心跳检测
  • 消息队列
  • 断线重传 等功能,具体看项目需求吧。

参考资料

后记

写这篇文章的时候,发现鸿蒙 5.0 的文档更新了不少,API 也变得更易用了。特别是 WebSocket 模块,增加了不少实用的功能。希望这篇文章能帮到正在学习鸿蒙开发的同学。如果有问题,欢迎在评论区讨论。

本文由博客一文多发平台 OpenWrite 发布!

相关推荐
摸鱼仙人~2 小时前
如何创建基于 TypeScript 的 React 项目
javascript·react.js·typescript
一生躺平的仔19 小时前
TypeScript入门(九)装饰器:TypeScript的"元编程超能力"
typescript
MiyueFE19 小时前
让我害怕的 TypeScript 类型 — — 直到我学会了这 3 条规则
前端·typescript
前端拿破轮20 小时前
😭😭😭看到这个快乐数10s,我就知道快乐不属于我了🤪
算法·leetcode·typescript
前端_ID林20 小时前
每个开发人员都应该知道的 TypeScript 技巧
typescript
奋飛1 天前
TypeScript系列:第六篇 - 编写高质量的TS类型
javascript·typescript·ts·declare·.d.ts
BillKu11 天前
Vue3 + TypeScript + xlsx 导入excel文件追踪数据流转详细记录(从原文件到目标数据)
前端·javascript·typescript
小Lu的开源日常11 天前
Drizzle vs Prisma:现代 TypeScript ORM 的深度对比
数据库·typescript·前端框架
Shixaik11 天前
配置@为src
typescript·前端框架
BillKu11 天前
Vue3 + TypeScript合并两个列表到目标列表,并且进行排序,数组合并、集合合并、列表合并、list合并
vue.js·typescript·list