Flutter for OpenHarmony:json_rpc_2 比 REST 更轻量的远程调用协议,实现高效的前后端通信(JSON-RPC 2.0 实现) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:json_rpc_2 比 REST 更轻量的远程调用协议,实现高效的前后端通信(JSON-RPC 2.0 实现) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net

前言

在现代软件架构中,RPC (Remote Procedure Call) 无处不在。它允许我们像调用本地函数一样调用远程服务器上的函数。虽然 gRPC 和 REST (HTTP/JSON) 十分流行,但在一些特定场景下,JSON-RPC 2.0 依然是不可替代的标准。

  • 轻量级:仅依赖 JSON,无须复杂的 Protobuf 编解码或 HTTP Header 开销。
  • 传输无关:可以跑在 WebSocket、TCP Socket、甚至串口(Serial Port)上。
  • 广泛支持:以太坊(Ethereum)、比特币(Bitcoin)节点通信全部基于 JSON-RPC。
  • 简单明了:人眼可读,调试极其方便。

json_rpc_2 是 Google 官方维护的一个 Dart 库,严格遵循 JSON-RPC 2.0 规范,提供了极高质量的 Client 和 Server 实现。

对于 OpenHarmony 开发者,这意味着你可以轻松地用 Dart 构建与底层硬件(如智能家居网关、工控机)通信的客户端,或者搭建一个极简的微服务 API。

一、核心原理与协议规范

1.1 JSON-RPC 2.0 协议详解

JSON-RPC 的消息体极其简洁。

请求 (Request)

{"jsonrpc":"2.0","method":"subtract","params":[42,23],"id":1}

响应 (Response)

{"jsonrpc":"2.0","result":19,"id":1}

通知 (Notification)
没有 id 字段,服务端收到后不返回任何结果(Fire-and-Forget)。

{"jsonrpc":"2.0","method":"update","params":[1,2,3,4,5]}

错误 (Error)

{"jsonrpc":"2.0","error":{"code":-32601,"message":"Method not found"},"id":"1"}

json_rpc_2 库完全封装了这些 JSON 细节,让你直接面对 Dart 对象编程。

调用方法 add

序列化

网络传输 TCP/WS

逻辑处理

响应 JSON

返回 Future/结果

Flutter 客户端

json_rpc_2 库

请求明文

服务端

计算结果

二、核心 API 详解

2.1 客户端 (Client)

客户端需要一个 StreamChannel 来传输数据。这个 Channel 可以来自 web_socket_channel(用于 Web),也可以来自 dart:ioSocket(用于 TCP)。

import'package:json_rpc_2/json_rpc_2.dart';import'package:web_socket_channel/io.dart';voidmain()async{// 1. 建立连接var socket =IOWebSocketChannel.connect('ws://localhost:4321');// 2. 创建 Clientvar client =Client(socket.cast());// 3. 必须先 listen (启动消息循环)unawaited(client.listen());try{// 4. 发送请求var result =await client.sendRequest('add',[1,2]);print('1 + 2 = $result');// 5. 发送通知 (无返回值) client.sendNotification('log',['Connection established']);}finally{await client.close();}}
在这里插入图片描述

2.2 服务端 (Server)

服务端 API 同样简洁。你可以注册方法来处理请求。

import'package:json_rpc_2/json_rpc_2.dart';import'package:shelf/shelf_io.dart'as io;import'package:shelf_web_socket/shelf_web_socket.dart';voidmain(){var handler =webSocketHandler((webSocket){var server =Server(webSocket.cast());// 注册方法 server.registerMethod('add',(Parameters params){var nums = params.asList;return nums[0]+ nums[1];}); server.registerMethod('subtract',(Parameters params){var nums = params.asList;return nums[0]- nums[1];});// 启动监听 server.listen();}); io.serve(handler,'localhost',4321).then((server){print('Serving at ws://${server.address.host}:${server.port}');});}

2.3 错误处理

json_rpc_2 会自动抛出 RpcException。你可以捕获具体的错误码。

try{await client.sendRequest('unknown_method');}onRpcExceptioncatch(e){if(e.code ==RpcException.methodNotFound){print('Method not found!');// Code -32601}else{print('Error ${e.code}: ${e.message}');}}
在这里插入图片描述

三、OpenHarmony 平台适配实战

在鸿蒙系统(尤其是 IoT 设备)中,TCP 通信比 HTTP 更常见且更高效。我们可以使用 Dart 原生的 Socket 来承载 JSON-RPC。

3.1 基于 TCP Socket 的全双工通信

假设我们有一个运行在鸿蒙开发板上的 Dart 服务端,控制 LED 灯。

// lib/rpc_server.dart (运行在开发板)import'dart:io';import'package:json_rpc_2/json_rpc_2.dart';import'package:stream_channel/stream_channel.dart';voidstartServer()async{// 监听 8080 端口var serverSocket =awaitServerSocket.bind(InternetAddress.anyIPv4,8080);print('Listening on port 8080...');awaitfor(var socket in serverSocket){// 将 Socket 包装为 StreamChannel<String> (UTF-8)var channel = jsonDocument.bind(StreamChannel(socket, socket));var rpcServer =Server(channel);// 注册控制方法 rpcServer.registerMethod('set_led',(Parameters params){ bool on= params['on'].asBool;// 获取命名参数print('Turning LED ${on ? 'ON' : 'OFF'}');// 硬件操作逻辑: GPIO.output(1, on);return{'status':'ok','led':on};}); rpcServer.listen();}}

3.2 客户端控制 App (Flutter)

// lib/rpc_client.dartimport'dart:io';import'package:json_rpc_2/json_rpc_2.dart';import'package:stream_channel/stream_channel.dart';classIotController{Client? _client;Future<void>connect(String ip)async{var socket =awaitSocket.connect(ip,8080);// 创建双向通道var channel = jsonDocument.bind(StreamChannel(socket, socket)); _client =Client(channel); _client!.listen();// 启动循环}Future<void>toggleLed(bool on)async{if(_client ==null|| _client!.isClosed)throwException('Not connected');// 调用远程方法// 虽然是异步网络请求,写起来就像本地函数调用try{var response =await _client!.sendRequest('set_led',{'on':on});print('Response: $response');}catch(e){print('RPC Error: $e');}}}

这个例子展示了 json_rpc_2 最强大的能力:Transport Agnostic (传输无关性)。只要你能提供一个 StreamChannel,不管是 TCP、WebSocket,甚至是 Bluetooth RFCOMM,它都能跑起来。

在这里插入图片描述

四、高级进阶:批量请求 (Batch Request)

JSON-RPC 2.0 支持一次发送多个请求,常用于初始化大量数据。

// 客户端 client.withBatch((){ client.sendRequest('add',[1,1]); client.sendRequest('add',[2,2]); client.sendNotification('log',['Batch test']);}).then((results){// results 包含所有返回结果print(results);// [2, 4, null] });

这对于移动网络环境极其友好,减少了 RTT(往返时延)。

五、总结

json_rpc_2 是 Dart 生态中被严重低估的一个库。它虽然看起来简单,但却是构建高可靠、低延迟、跨语言通信系统的基石。

与 gRPC 相比,它无需生成代码,调试只需 print;与 REST 相比,它支持全双工 Notification 推送。
对于 OpenHarmony 开发者,特别是涉及 硬件交互、即时通讯、区块链交互 的场景,JSON-RPC 是你的不二之选。

最佳实践

  1. 超时控制:在 sendRequest 后加上 .timeout(Duration(seconds: 5)),防止网络挂死。
  2. 错误定义:在服务端统一定义业务错误码(如 -32001 代表硬件故障),客户端据此做 UI 提示。

Read more

【AI大模型】DeepSeek + 通义万相高效制作AI视频实战详解

【AI大模型】DeepSeek + 通义万相高效制作AI视频实战详解

目录 一、前言 二、AI视频概述 2.1 什么是AI视频 2.2 AI视频核心特点 2.3 AI视频应用场景 三、通义万相介绍 3.1 通义万相概述 3.1.1 什么是通义万相 3.2 通义万相核心特点 3.3 通义万相技术特点 3.4 通义万相应用场景 四、DeepSeek + 通义万相制作AI视频流程 4.1 DeepSeek + 通义万相制作视频优势 4.1.1 DeepSeek 优势 4.1.2 通义万相视频生成优势 4.2

By Ne0inhk
【DeepSeek微调实践】DeepSeek-R1大模型基于MS-Swift框架部署/推理/微调实践大全

【DeepSeek微调实践】DeepSeek-R1大模型基于MS-Swift框架部署/推理/微调实践大全

系列篇章💥 No.文章01【DeepSeek应用实践】DeepSeek接入Word、WPS方法详解:无需代码,轻松实现智能办公助手功能02【DeepSeek应用实践】通义灵码 + DeepSeek:AI 编程助手的实战指南03【DeepSeek应用实践】Cline集成DeepSeek:开源AI编程助手,终端与Web开发的超强助力04【DeepSeek开发入门】DeepSeek API 开发初体验05【DeepSeek开发入门】DeepSeek API高级开发指南(推理与多轮对话机器人实践)06【DeepSeek开发入门】Function Calling 函数功能应用实战指南07【DeepSeek部署实战】DeepSeek-R1-Distill-Qwen-7B:本地部署与API服务快速上手08【DeepSeek部署实战】DeepSeek-R1-Distill-Qwen-7B:Web聊天机器人部署指南09【DeepSeek部署实战】DeepSeek-R1-Distill-Qwen-7B:基于vLLM 搭建高性能推理服务器10【DeepSeek部署实战】基于Ollama快速部署Dee

By Ne0inhk

DeepSeek各版本说明与优缺点分析_deepseek各版本区别

DeepSeek各版本说明与优缺点分析 DeepSeek是最近人工智能领域备受瞩目的一个语言模型系列,其在不同版本的发布过程中,逐步加强了对多种任务的处理能力。本文将详细介绍DeepSeek的各版本,从版本的发布时间、特点、优势以及不足之处,为广大AI技术爱好者和开发者提供一份参考指南。 1. DeepSeek-V1:起步与编码强劲 DeepSeek-V1是DeepSeek的起步版本,这里不过多赘述,主要分析它的优缺点。 发布时间: 2024年1月 特点: DeepSeek-V1是DeepSeek系列的首个版本,预训练于2TB的标记数据,主打自然语言处理和编码任务。它支持多种编程语言,具有强大的编码能力,适合程序开发人员和技术研究人员使用。 优势: * 强大编码能力:支持多种编程语言,能够理解和生成代码,适合开发者进行自动化代码生成与调试。 * 高上下文窗口:支持高达128K标记的上下文窗口,能够处理较为复杂的文本理解和生成任务。 缺点: * 多模态能力有限:该版本主要集中在文本处理上,缺少对图像、语音等多模态任务的支持。 * 推理能力较弱:尽管在自然语言

By Ne0inhk

用DeepSeek和Cursor从零打造智能代码审查工具:我的AI编程实践

💂 个人网站:【 摸鱼游戏】【神级代码资源网站】【星海网址导航】摸鱼、技术交流群👉 点此查看详情 引言:AI编程革命下的机遇与挑战 GitHub统计显示,使用AI编程工具的开发者平均效率提升55%,但仅有23%的开发者能充分发挥这些工具的潜力。作为一名全栈工程师,我曾对AI编程持怀疑态度,直到一次紧急项目让我彻底改变了看法。客户要求在72小时内交付一个能自动检测代码漏洞、优化性能的智能审查系统,传统开发方式根本不可能完成。正是这次挑战,让我探索出DeepSeek和Cursor这对"黄金组合"的惊人潜力。 一、工具选型:深入比较主流AI编程工具 1.1 为什么最终选择DeepSeek+Cursor? 经过两周的对比测试,我们发现不同工具在代码审查场景的表现差异显著: 工具代码理解深度响应速度定制灵活性多语言支持GitHub Copilot★★★☆★★★★★★☆★★★★Amazon CodeWhisperer★★☆★★★☆★★★★★★☆DeepSeek★★★★☆★★★★★★★☆★★★★☆Cursor★★★☆★★★★☆★★★★★★★★ 关键发现: * Dee

By Ne0inhk