HarmonyOS-ArkUI Rcp模块类关系梳理

news2025/4/7 5:20:50

前言

本文重点解决的是,按照官网学习路径学习Tcp模块内容时,越看越混乱的问题。仿照官网案例,书写代码时,产生的各种疑惑。比如,类与类之间的关系,各种配置信息究竟有多少,为什么越写越混乱。那些官方文档中并没有提及的令人迷惑的地方。

本篇文章适合在看RCP官方教程之前,做辅助铺垫用。以便于更容易理解其代码书写原因,做到写一遍之后就不用再参照文档,自己自然就知道怎么写了。官方教程连接如下

对于文章中有些图片由于太大展示模糊,请在附件中下载,便于清晰阅览!

华为开发者学堂

好接下来讲讲这个RCP模块。

正文

Rcp我之前知之甚少。查了一下才知道这个协议很适合分布式系统的实现,是分布式系统实现高效通讯的重要工具。并且是官方主推替代http模块的工具。

原因是,Rcp可以实现http能实现的能力,而且能做到http做不到事, 比Http更好用,具备更多的功能。

RCP提供的能力与设置,涵盖了整个Http所有环节

  • 发起网络请求
  • 多表单提交
  • 双向证书校验
  • DNS灵活的解析方式(系统,自定义)
  • 数据发送数据传输与数据响应拦截
  • 捕获有关http发送流,响应流的信息

RCP请求过程

首先先对请求过程有大致的了解,接下来我们重点介绍的,RCP代码中, 请求配置参数,几乎涵盖每一个细节的配置方式。大家看到配置信息的时候,能回顾到大致会影响到哪些环节即可。

RCP框架简介

  • RCP全称 Remote Communication Platform。其通过对HTTP协议的NAPI封装,提供基于场景化的声明式开发范式API接口,使开发人员无需处理低级别的HTTP细节,降低代码量并提升开发效率。
  • 提供基于会话的多线程模型,并动态调整和部署HTTP参数。
  • 相比于ohos.net.http模块。RCP在并发场景下进行了性能优化,使数据传输更快,性能更强。

代码实现及代码使用上的关系梳理

Session

Session指的是会话,它主要用于管理一组相关的请求(Request)与响应(Response)。 也就是跟请求是1vn的关系。

它管理的是很多请求,这点需要着重理解下。同时Session内部管理了一组TCP连接,是一组!

  • 允许的最大并发TCP连接数,默认值为6条, 允许设置的最大的数量是2147483647条。
  • Session允许多个TCP连接同时连接,最大活跃条数支持量为64条, 允许设置的最大值也是2147483647条。
  • Session内部像Http一样实现了底层对TCP连接的复用。避免TCP连接频繁所带来的客户端和服务端资源浪费。
  • 正因为上述两个原因,它才能管理一组的相关请求与响应的。所以,一个Session的生命周期,可以很长。绝对要长过一条http请求。

一个应用最多能创建16个Session。 超出范围会报错。

Request 与 Response

Request指的是Http请求对象。用于构造http请求的信息,通过Session发送出去,从而获得对应的数据响应(Response)

关系总结

Session是一个生命周期略长的会话,在会话期间,可以发送多条Request,从而获取Response。

所以他们的使用规则在代码上的表现为:

// 首先先创建一个Session实例,此为最简单的实例创建方式。商业代码中会很复杂。
// 此session之后会不断地被用来发送请求。与request是1vn的关系
const session = rcp.createSession(sessionCfg)



// 创建一个request实例, request实例会有很多参数,之后我们会涉及学习。
let req = new rcp.Request('/test/post', 'POST', rcpHeader, multiForm, cookies, transferRange, configuration)

// 发送
session.fetch(req).then((response) => {
      hilog.info(this.LOG_DOMAIN, this.LOG_TAG, "rcp request fetch success! response=" + JSON.stringify(response))
    }).catch((err : BusinessError) => {
      hilog.error(this.LOG_DOMAIN, this.LOG_TAG, "rcp request fetch error! err=" + JSON.stringify(err))
})

最粗略的调用关系就是这些。

有关于RCP中的各项Configuration

在商用代码中的调用,远不如上一节中的代码那么简单。要确保数据的传输绝对安全,也要确保数据的传输速度很快,很高效。另外,对于每一条请求还有一些统计上的需求,比如响应延迟时常,正确回复率等等,这是服务端伙伴们向上汇报的重要数据。总之啊,商用代码要加一些配置才能确保数据传输的安全和高效,这里讲的配置就是Configuration。

Session实例中的配置-SessionConfiguration

上文已经讲到了,Session负责的是n多条TCP连接,掌管n多个http请求响应过程。所以Session的配置有以下特点

  • 配置内容偏公共偏基础,以便于每一条请求响应中可以用到
  • 有一些不乏便于管理的配置项

createSession函数的声明为:

export function createSession(sessionConfiguration?: SessionConfiguration): Session;

在使用的时候我们直接用rcp调用即可。传入的参数就是配置参数 SessionConfiguration。

const session = rcp.createSession(sessionCfg) // sessionCfg为 SessionConfiguration对象, 管配置的

SessionConfiguration

SessionConfiguration是一个很庞大的配置类,其下聚合了很多方面的配置。这些配置单看源码的话,非常容易混淆,使用的时候需要不断的查源码看调用方式。比较麻烦。 另外就是。config的存在,便于我们按图索骥,大约能估摸出来这个RCP具体实现了什么能力。

我画了一张图,便于查看持有关系,以及分类脉络便于记忆。由于图片太大,本文附件中会包含一份整理完的原图。

Request实例中的配置

Request实例的初始化方法是:

let req = new rcp.Request('/test/post', 'POST', rcpHeader, multiForm, cookies, transferRange, configuration)

这个request初始化的时候,是需要很多参数的,我们这个章节讲的就是配置,只拿最后一个参数讲,就是Request的专有配置, 类型为 Configuration。

constructor(url: URLOrString, method?: HttpMethod, headers?: RequestHeaders, content?: RequestContent, cookies?: RequestCookies, transferRange?: TransferRange | TransferRange[], configuration?: Configuration);

这个Configuration与Session对象创建时传入的SessionConfiguration中的 requestConfiguration属性,类型是一样的。也就是Session间接持有了一个Configuration, 而Request直接持有了 Configuration, 与此同时还存在一些配置项,如Header, Cookies 都有可能在整个系统中出现两份!

接下来明了了,也就是如图所示,Session创建实例的时候传入的配置信息,和Request创建实例的时候传入的配置信息,有一部分是冲突的!存在冲突的可能!

session组件,Request组件同时设置configuration,哪个会生效

既然代码设置的时候,像上一章讲的存在两份,那么必然会存在冲突问题。RCP模块中对于这种冲突的处理流程如下图所示:

Configuration以request组件中的参数为准, 如果request中没有设置,就以session为准。

Response对象

对于Response对象,这个就是请求之后返回来的响应对象。对于这个对象的了解,侧重点就是其数据结构。它里面的属性很多都是只读的。我们知道什么属性存什么数据就行了。

我将Response也画了一个图,以便于有大致的印象。

铺垫好这些内容之后,请大家愉快的学习官方文档吧:

华为开发者学堂

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2328846.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

26考研——线性表_ 线性表的链式表示_双循环链表(2)

408答疑 文章目录 三、 线性表的链式表示双循环链表单链表与双链表的比较单链表的特点双链表的特点 双链表上基本操作的实现双链表的插入操作双链表的删除操作 双链表的代码实操定义结点创建一个结点带头结点的双链表初始化创建双链表打印双链表查找结点插入结点在指定节点后插…

基于springboot的考研成绩查询系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 这些年随着Internet的迅速发展,我们国家和世界都已经进入了互联网大数据时代,计算机网络已经成为了整个社会以及经济发展的巨大动能,考研成绩查询管理事务现在已经成为社会关注的重要内容,因此运用互联网技术来提高考研成绩…

es自定义ik分词器中文词库实现热更新

基于web地址的方式实现ik分词热更新。 操作系统:win 11 es version:8.6.2 ik version:8.6.2 1、创建web服务,并提供ik查询词库接口 编写分词http url代码,返回自定义分词内容分词词库数据来自业务需求,存…

OpenStack 卷虚拟机跨租户迁移方案

目标:迁移租户A的卷虚机到租户B 场景:使用卷虚拟机,租户a和b使用相同网络 租户A的操作: 1.记录虚拟机的ip地址,Mac信息, nova interface-list neutron port-show 2.对虚拟机进行关机操作,将…

添加购物车功能

业务需求: 用户提交三个字段,服务端根据提交的字段判断是菜品还是套餐,根据菜品或者套餐添加购物车表中。 代码实现 RestController Slf4j RequestMapping("/user/shoppingCart") public class ShoppingCartController {Autowired…

Python爬虫第2节-网页基础和爬虫基本原理

目录 一、网页基础 1.1 网页的组成 1.2 网页的结构 1.3 节点树及节点间的关系 1.4 选择器 二、爬虫的基本原理 2.1 爬虫概述 2.2 能抓怎样的数据 2.3 JavaScript 渲染页面 一、网页基础 使用浏览器访问网站时,我们会看到各式各样的页面。你是否思考过&…

【网络协议】三次握手与四次挥手

例如我们使用MobaXterm登录服务器的时候,基于TCP协议的之间是如何进行通信的? 使用工具:wireshark抓取传输层TCP协议 三次握手 mobaxterm:登录服务器触发三次握手 wireshark过滤分析 ip.addr 192.168.3.239 192.168.3.239登录…

JS API

const变量优先 即对象、数组等引用类型数据可以用const声明 API作用和分类 DOM (ducument object model) 操作网页内容即HTML标签的 树状模型 HTML中标签 JS中对象 最大对象 document 其次大 html 以此类推 获取DOM对象 CSS 中 使用选择器 JS 中 选多个 时代的眼泪 修…

“一路有你”公益行携手《东方星动》走进湖南岳阳岑川镇中心小学

2025年4月2日,“一路有你”公益行携手《东方星动》走进湖南岳阳岑川镇,一场充满爱与温暖的捐赠仪式在岑川镇中心小学隆重举行。这是一场跨越千里的爱心捐赠,也是一场别开生面的国防教育,更是一场赋能提质的文化盛宴。 岑川镇地处湘…

vue组件开发:什么是VUE组件?

什么是VUE组件 在我们实际开发过程中你也许会发现有很多代码是重复的,它们可能是一个按钮、一个表单、一个列表等等,其中最为显著的应该是列表。 以CSDN的首页为例: 上述截图中的文章列表可能会在多处出现,比如此截图是精选博客…

仿小红书社交源码+及时通讯聊天软件APP源码

多端支持,数据互通 本程序支持H5、小程序、安卓、iOS四端运行,共用同一套后台管理系统,确保数据同步,用户可在不同设备上无缝切换,实现真正的多端互通。 技术架构 前端技术:Vue2、uni-app、HTML、CSS、Jav…

Java基础:面向对象进阶(二)

01-static static修饰成员方法 static注意事项(3种) static应用知识:代码块 static应用知识:单列模式 02-面向对象三大特征之二:继承 什么是继承? 使用继承有啥好处? 权限修饰符 单继承、Object类 方法重…

ttkbootstrap 实现日期选择器, 开始和结束时间

ttkbootstrap 实现日期选择器, 开始和结束时间 1. 展示 2. 打印 3. 源码 from datetime import datetime import ttkbootstrap as ttkclass DateTimeEntryStart(ttk.Frame):def __init__(self, masterNone, **kwargs):super().__init__(master, **kwargs)self.dat…

Vulnhub-PrinkysPalacev3

Vulnhub-PrinkysPalacev3 1、主机发现 arp-scan -l 扫描同网段 2、端口扫描 nmap -sS -sV 192.168.66.185 nmap -sS -A -T4 -p- 192.168.66.185 nmap --scriptvuln 192.168.66.185 PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 2.0.8 or later 5555/tcp o…

matlab从pytorch中导入LeNet-5网络框架

文章目录 一、Pytorch的LeNet-5网络准备二、保存用于导入matlab的model三、导入matlab四、用matlab训练这个导入的网络 这里演示从pytorch的LeNet-5网络导入到matlab中进行训练用。 一、Pytorch的LeNet-5网络准备 根据LeNet-5的结构图,我们可以写如下结构 import…

Spring Boot向Vue发送消息通过WebSocket实现通信

注意:如果后端有contextPath,如/app,那么前端访问的url就是ip:port/app/ws 后端实现步骤 添加Spring Boot WebSocket依赖配置WebSocket端点和消息代理创建控制器,使用SimpMessagingTemplate发送消息 前端实现步骤 安装sockjs-…

网络编程—Socket套接字(UDP)

上篇文章: 网络编程—网络概念https://blog.csdn.net/sniper_fandc/article/details/146923380?fromshareblogdetail&sharetypeblogdetail&sharerId146923380&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 目录 1 概念 2 Soc…

视频设备轨迹回放平台EasyCVR综合智能化,搭建运动场体育赛事直播方案

一、背景 随着5G技术的发展,体育赛事直播迎来了新的高峰。无论是NBA、西甲、英超、德甲、意甲、中超还是CBA等热门赛事,都是值得记录和回放的精彩瞬间。对于体育迷来说,选择观看的平台众多,但是作为运营者,搭建一套体…

AIGC实战——CycleGAN详解与实现

AIGC实战——CycleGAN详解与实现 0. 前言1. CycleGAN 基本原理2. CycleGAN 模型分析3. 实现 CycleGAN小结系列链接 0. 前言 CycleGAN 是一种用于图像转换的生成对抗网络(Generative Adversarial Network, GAN),可以在不需要配对数据的情况下将一种风格的图像转换成…

VS2022远程调试Linux程序

一、 1、VS2022安装参考 VS Studio2022安装教程(保姆级教程)_visual studio 2022-CSDN博客 注意:勾选的时候,要勾选下方的选项,才能调试Linux环境下运行的程序! 2、VS2022远程调试Linux程序测试 原文参…