鸿蒙 + Electron:跨平台桌面应用开发新范式

作者 :L、218
发布平台 :CSDN
标签:#鸿蒙 #Electron #跨平台开发 #HarmonyOS #桌面应用 #WebSocket通信


🌟 引言:当鸿蒙遇上 Electron

随着华为鸿蒙系统(HarmonyOS)生态的不断扩展,其"一次开发,多端部署"的理念正在改变全场景智能设备的交互方式。与此同时,Electron 作为使用 Web 技术构建桌面应用的主流框架,已被 VS Code、Figma、Slack 等知名软件广泛采用。

但你是否思考过这样一个问题:

能否让运行在 PC 上的 Electron 应用,与鸿蒙设备(如手机、平板)实现数据互通和实时协同?

本文将带你探索这一前沿方向 ------ 基于 WebSocket 实现 Electron 与鸿蒙设备的双向通信,并通过完整图文教程 + 可运行代码案例,手把手教你打造一个跨平台消息同步系统!


📚 目录

  1. 背景介绍:鸿蒙 vs Electron
  2. 技术融合可行性分析
  3. 实战场景设计
  4. Electron 端实现
  5. 鸿蒙端实现(ArkTS)
  6. 效果展示与截图
  7. 常见问题与解决方案
  8. 项目源码地址
  9. 结语与展望

1️⃣ 背景介绍

🔹 鸿蒙系统(HarmonyOS)

鸿蒙是华为推出的分布式操作系统,支持手机、手表、智慧屏、车机等多设备统一调度。核心优势包括:

  • ✅ 分布式软总线:设备间自动发现、无缝连接
  • ✅ 原子化服务:轻量级、免安装
  • ✅ 多端协同:任务流转、数据共享

https://img-blog.csdnimg.cn/20210608101234123.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjY1NDg2,size_16,color_FFFFFF,t_70
图:鸿蒙多设备协同示意图


🔹 Electron 框架

Electron 允许开发者使用 HTML + CSS + JavaScript 构建跨平台桌面应用(Windows / macOS / Linux),其架构分为两个进程:

进程 功能
主进程(Main) 创建窗口、调用系统 API、管理生命周期
渲染进程(Renderer) 显示网页界面,类似浏览器标签页

https://img-blog.csdnimg.cn/20210608101522567.png
图:Electron 架构图


2️⃣ 技术融合可行性分析

虽然目前无法将 Electron 直接运行在鸿蒙上(底层内核不同),但我们可以通过以下方式实现功能联动:

方式 是否可行 说明
HTTP 接口通信 ✅ 推荐 使用 RESTful 或 JSON-RPC
WebSocket 实时通信 ✅ 强烈推荐 支持双向推送
文件共享 ⚠️ 局限大 依赖本地存储
华为 HMS Core 中转 ✅ 高级方案 适合云端协同

✅ 本文选择 WebSocket 方案,实现实时、低延迟的消息同步。


3️⃣ 实战场景设计

🎯 场景目标

构建一个"跨设备消息中心":

  • Electron 应用:运行于 PC,显示来自鸿蒙设备的消息
  • 鸿蒙应用:运行于模拟器或真机,发送消息到桌面端
  • 通信协议:WebSocket
  • 数据流向:鸿蒙 → Electron(单向演示,可扩展为双向)

4️⃣ Electron 端实现

步骤一:初始化项目

复制代码
mkdir harmony-electron-demo
cd harmony-electron-demo
npm init -y
npm install electron ws --save-dev

步骤二:创建主进程文件 main.js

复制代码
const { app, BrowserWindow, ipcMain } = require('electron')
const path = require('path')
const WebSocket = require('ws')

let mainWindow

function createWindow() {
  mainWindow = new BrowserWindow({
    width: 900,
    height: 600,
    title: '鸿蒙-Electron 消息中心',
    webPreferences: {
      preload: path.join(__dirname, 'preload.js'),
      contextIsolation: true
    }
  })

  mainWindow.loadFile('index.html')
}

// 启动 WebSocket 服务
const wss = new WebSocket.Server({ port: 8080 }, () => {
  console.log('✅ WebSocket 服务器启动:ws://localhost:8080')
})

wss.on('connection', (ws, req) => {
  const clientIP = req.socket.remoteAddress
  console.log(`🔗 客户端连接:${clientIP}`)

  ws.send(JSON.stringify({ type: 'welcome', data: '已连接至 Electron' }))

  ws.on('message', (data) => {
    try {
      const msg = JSON.parse(data)
      if (msg.type === 'harmony-message') {
        // 发送到前端页面
        mainWindow.webContents.send('new-message', msg.data)
      }
    } catch (e) {
      console.error('消息解析失败', e)
    }
  })

  ws.on('close', () => {
    console.log('🔚 客户端断开连接')
  })
})

app.whenReady().then(() => {
  createWindow()

  app.on('activate', () => {
    if (BrowserWindow.getAllWindows().length === 0) createWindow()
  })
})

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') app.quit()
})

创建预加载脚本 preload.js

复制代码
const { contextBridge, ipcRenderer } = require('electron')

contextBridge.exposeInMainWorld('electronAPI', {
  onNewMessage: (callback) =>
    ipcRenderer.on('new-message', (_event, value) => callback(value))
})

创建前端页面 index.html

修改 package.json 添加启动命令

启动命令:

创建页面 Index.ets

复制代码
// pages/Index.ets
import webSocket from '@ohos.net.webSocket';
import router from '@ohos.router';

@Entry
@Component
struct Index {
  @State status: string = '未连接'
  @State receivedMsg: string = ''
  private socket = webSocket.createWebSocket();

  build() {
    Column() {
      Text('鸿蒙客户端').fontSize(22).fontWeight(FontWeight.Bold).margin(20)

      Text(this.status)
        .fontSize(16)
        .textColor(this.getStatusColor())
        .margin({ top: 10, bottom: 20 })

      Button('🔌 连接 Electron')
        .onClick(() => this.connectToElectron())
        .backgroundColor('#007DFD')
        .width(200)
        .height(45)
        .fontColor(Color.White)
        .margin(10)

      Button('📤 发送测试消息')
        .onClick(() => this.sendMessage())
        .backgroundColor('#4CAF50')
        .width(200)
        .height(45)
        .fontColor(Color.White)
        .margin(10)
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
  }

  getStatusColor(): Color {
    if (this.status.includes('成功')) return Color.Green
    if (this.status.includes('失败')) return Color.Red
    return Color.Gray
  }

  connectToElectron() {
    // 注意:Android 模拟器访问本机使用 10.0.2.2
    // 若使用真机,请确保在同一局域网,并填写 PC 的 IP 地址
    const url = 'ws://10.0.2.2:8080'

    this.socket.connect(url, {
      protocol: 'chat',
      timeOut: 5000
    }).then(() => {
      this.status = '✅ 已连接到 Electron'
      this.setupMessageListener()
    }).catch((err) => {
      this.status = `❌ 连接失败: ${err.message}`
      console.error('连接错误:', err)
    })
  }

  setupMessageListener() {
    this.socket.on('message', (data) => {
      if (typeof data === 'string') {
        console.info('收到来自 Electron 的欢迎消息:', data)
        try {
          const res = JSON.parse(data)
          if (res.type === 'welcome') {
            this.receivedMsg = res.data
          }
        } catch (e) {
          console.warn('非 JSON 消息:', data)
        }
      }
    })
  }

  sendMessage() {
    const message = {
      type: 'harmony-message',
      data: `【鸿蒙】用户点击发送 - ${new Date().toLocaleTimeString()}`
    }

    this.socket.send({
      data: JSON.stringify(message)
    }).then(() => {
      console.info('消息已成功发送')
    }).catch((err) => {
      this.status = `发送失败: ${err.message}`
      console.error('发送失败:', err)
    })
  }
}

💡 关键提示

  • 模拟器中访问主机用 10.0.2.2
  • 真机需与电脑处于同一 WiFi,并使用电脑局域网 IP(如 192.168.1.100
  • module.``json5 中添加网络权限:

6️⃣ 效果展示

🖼️ 实际运行截图

Electron 桌面端 鸿蒙模拟器端

https://raw.githubusercontent.com/L218/harmony-electron-demo/main/screenshots/electron-ui.png https://raw.githubusercontent.com/L218/harmony-electron-demo/main/screenshots/harmony-app.png

✅ 成功实现:鸿蒙点击"发送",Electron 实时收到消息!

7️⃣ 常见问题

问题 解决方案

连接被拒绝 检查防火墙是否开放 8080 端口

10.0.2.2 不通 确保 Electron 启动且监听 0.0.0.0:8080

真机连不上 查看 PC 的局域网 IP(ipconfig / ifconfig)

提示无网络权限 在 module.json5 添加 ohos.permission.INTERNET

8️⃣ 项目源码

GitHub 仓库已开源,欢迎 Star!

👉 https://github.com/L218/harmony-electron-demo

包含:

Electron 完整工程

鸿蒙 ArkTS 项目

详细 README 启动指南

9️⃣ 结语

通过本文实践,我们成功实现了 Electron 桌面应用与鸿蒙设备的实时通信,展示了 Web 技术与分布式系统的融合潜力。

未来可以进一步拓展:

使用 HMS Push 实现离线消息唤醒

鸿蒙原子化服务控制 Electron 应用

构建"超级终端"级别的跨端协作工具

🔥 技术的本质是连接,而创新始于跨界!

如果你喜欢这篇文章,欢迎点赞 ❤️、收藏 🌟、评论交流!

关注我,持续分享 鸿蒙开发、Electron、前端工程化 干货内容!

📌 版权声明:本文由 L、218 原创,转载请注明出处及 GitHub 链接。

#鸿蒙开发 #Electron #跨平台 #HarmonyOS #桌面应用 #WebSocket #分布式通信 #CSDN #ArkTS #JavaScript #L218

https://openharmonycrossplatform.csdn.net/content

相关推荐
呆头鸭L22 分钟前
快速上手Electron
前端·javascript·electron
特立独行的猫a31 分钟前
[鸿蒙PC三方库交叉编译] libtool与鸿蒙SDK工具链的冲突解决方案:从glibc污染到参数透传的深度解析
华为·harmonyos·ndk·三方库移植·鸿蒙pc·libtool
哈__37 分钟前
Flutter For OpenHarmony 鸿蒙 PC 开发入门:环境搭建 + 工程初始化(附 PC 端专属配置)
flutter·华为·harmonyos
数字化顾问2 小时前
(123页PPT)华为流程体系建设与运营(附下载方式)
大数据·华为
搬砖的kk2 小时前
鸿蒙PC端二进制文件签名命令行使用指南(附实战测试)
华为·harmonyos
拓端研究室2 小时前
2025智能汽车产业深度研究报告:L3自动驾驶、Robotaxi|附680+份报告PDF、数据、可视化模板汇总下载
华为·pdf·自动驾驶
C雨后彩虹15 小时前
计算误码率
java·数据结构·算法·华为·面试
一月是个猫18 小时前
Electron入门指南:从零开始构建跨平台桌面应用
前端·electron
坚强小橙18 小时前
Accessibility 辅助功能总结
electron
sam.li1 天前
鸿蒙HAR对外发布安全流程
安全·华为·harmonyos