鸿蒙开发仓颉语言【在工程中使用Hyperion TCP框架】

3. 在工程中使用Hyperion TCP框架

3.1 导入Hyperion TCP框架的静态库

在工程的module.json中引入Hyperion TCP框架的静态库:

  "package_requires": {"package_option": {"hyperion_hyperion.buffer": "${path_to_hyperion_project}/build/release/hyperion/hyperion.buffer.cjo","hyperion_hyperion.logadapter": "${path_to_hyperion_project}/build/release/hyperion/hyperion.logadapter.cjo","hyperion_hyperion.objectpool": "${path_to_hyperion_project}/build/release/hyperion/hyperion.objectpool.cjo","hyperion_hyperion.threadpool": "${path_to_hyperion_project}/build/release/hyperion/hyperion.threadpool.cjo","hyperion_hyperion.transport": "${path_to_hyperion_project}/build/release/hyperion/hyperion.transport.cjo"},"path_option": []},

3.2 TCP框架客户端和服务端支持的配置

1. 客户端和服务端都支持的配置
Socket配置
TcpSocketOptions类的属性作用
prop port: UInt16设置TCP服务端的监听端口
prop receiveBufferSize: ?Int64接收缓冲区大小
prop sendBufferSizeVal: ?Int64发送缓冲区大小
prop noDelay: ?BoolTCP_NODELAY选项
prop linger: ?DurationSO_LINGER选项
prop readTimeout: ?DurationSocket读超时时间
prop writeTimeout: ?DurationSocket写超时时间
prop idleTimeout: Duration连接空闲超时时间
Hyperion TCP框架配置
TcpSocketOptions类的属性作用默认值
prop asyncWrite: Bool是否开启每个连接一个写线程true
prop sliceExceedBuffer: Bool是否通过切片方式减少数组拷贝true
prop maxMessageSizeInBytes: Int64支持处理的消息的最大长度64M
prop bufferAllocateSize: Int64分配的ByteBuffer大小8192
* prop usePooledBufferAllocator: Bool是否将ByteBuffer池化重用false
* prop maxPooledBuffers: Int64缓存的ByteBuffer的最大数量2048

标*的为实验性质配置,目前不建议在生产环境中修改这些配置的默认值

2. 服务端特有的配置
EndpointConfig类的属性作用
prop address: String设置TCP服务端的监听地址
prop backlogSize: ?Int64backlog队列大小
prop reuseAddress: ?BoolSO_REUSE_ADDR选项
prop sendBufferSizeVal: ?Int64发送缓冲区大小
prop reusePort: ?BoolSO_REUSE_PORT选项
prop acceptTimeout: ?DurationAccept超时时间
3. 客户端特有的配置
ClientEndpointConfig类的属性作用
prop host: String设置TCP服务端的监听地址
prop minConnections: Int64连接池的最小连接数
prop maxConnections: Int64连接池的最大连接数
prop waitConnectionTimeout: Duration等待连接超时时间

3.3 实现一个回写消息的服务端

3.3.1 需求

需求: 回写客户端发送过来的字符串消息
传输报文:4字节的字符串二进制数组长度+字符串的二进制数组

长度说明
4字节使用utf8编码的字符串的Byte数组的长度
n字节使用utf8编码的字符串的Byte数组
3.3.2 服务定义

编写一个回写字符串消息的服务:

public class EchoService {public func processMessage(message: String) {return message}}
3.3.3 实现编解码和调用服务的IoFilter

编写一个IoFilter,将入栈消息交给EchoService处理:

public class EchoHanlder <: SingularMessageIoFilter {private let service = EchoService()/*** 处理入栈消息*/public func processInboundMessage(context: IoFilterContext, session: Session, inMessage: Any): Unit {if (let Some(text) <- inMessage as String) {println("Received Message: ${text}")// 调用业务处理逻辑let result = service.processMessage(text)context.offerMessage(result)} else {let exception = Exception("Only accept string message")context.exceptionCaught(exception)}}public func processInboundException(context: IoFilterContext, session: Session, ex: Exception) {context.exceptionCaught(ex)}/***  处理出栈消息*/public func processOutboundMessage(context: IoFilterContext, session: Session, outMessage: Any): Unit {// 转交给下一个IoFilter处理context.offerMessage(outMessage)}public func processOutboundException(context: IoFilterContext, session: Session, ex: Exception): Unit {context.exceptionCaught(ex)}public func toString() {return "EchoHanlder"}
}

编写一个将字符串转换为二进制数组的IoFilter,由于hyperion.transport.ByteAndStringCodec已经实现该功能,可以直接选用ByteAndStringCodec
编写一个给二进制数组添加报文长度的IoFilter,由于hyperion.transport.LengthBasedFrameCodec已经实现该功能,可以直接选用LengthBasedFrameCodec

3.3.4 编写TCP服务端

编写服务端,并添加编解码和调用服务使用的IoFilter:

    let config = EndpointConfig()config.address = "127.0.0.1"config.port = 8090// 服务端使用的线程池let threadPool = ThreadPoolFactory.createThreadPool(3, 128, 4096, Duration.minute * 2)// 创建服务端Endpointlet tcpEndpoint = TcpEndpoint(config, threadPool)// 使用4字节记录报文长度的编解码器let lengthFrameEncoder = LengthBasedFrameEncoder(4)let lengthFrameDecoder = LengthBasedFrameDecoder(4)// 判断报文是否包含完整消息的MessageCompletedHandlertcpEndpoint.setMessageCompletedHandler(lengthFrameDecoder)// 解析报文长度的IoFiltertcpEndpoint.addFilter(LengthBasedFrameCodec(lengthFrameEncoder, lengthFrameDecoder))// 字符串和二进制数组转换的IoFiltertcpEndpoint.addFilter(ByteAndStringCodec())// 调用服务的IoFiltertcpEndpoint.addFilter(EchoHanlder())// 启动服务端EndpointtcpEndpoint.start()

3.4 实现一个收发字符串消息的客户端

3.4.1 需求

需求: 向服务端发送字符串,并收取字符串响应
传输报文:4字节的字符串二进制数组长度+字符串的二进制数组

长度说明
4字节使用utf8编码的字符串的Byte数组的长度
n字节使用utf8编码的字符串的Byte数组
3.4.2 实现接收响应消息的类
public class EchoResponse {private var exception: ?Exception = Noneprivate var message: ?String = Nonepublic func setException(exception: Exception) {this.exception = exception}public func getException(): ?Exception {return this.exception}public func setMessage(message: String) {this.message = message}public func getMessage(): String {if (let Some(ex) <- exception) {throw ex}if (let Some(message) <- message) {return message}throw Exception("No response message")}
}
3.4.3 实现编解码和调用服务的IoFilter

编写一个IoFilter,将收取到的消息放入队列中,以便后续获取使用:

public class ClientHandler <: SingularMessageIoFilter {private let messages = BlockingQueue<EchoResponse>()public func takeMessage(): String {let echoResponse = messages.dequeue()return echoResponse.getMessage()}public func takeMessage(timeout: Duration): ?String {if (let Some(echoResponse) <- messages.dequeue(timeout)) {return echoResponse.getMessage()}return None}/*** 处理入栈消息*/public func processInboundMessage(context: IoFilterContext, session: Session, inMessage: Any): Unit {let echoResponse = EchoResponse()if (let Some(text) <- inMessage as String) {echoResponse.setMessage(text)} else {let exception = Exception("Only accept string message")echoResponse.setException(exception)}// 添加到messages队列中,不再交给下一个IoFilter处理messages.enqueue(echoResponse)}public func processInboundException(context: IoFilterContext, session: Session, ex: Exception) {let echoResponse = EchoResponse()echoResponse.setException(ex)// 添加到messages队列中,不再交给下一个IoFilter处理messages.enqueue(echoResponse)}/***  处理出栈消息*/public func processOutboundMessage(context: IoFilterContext, session: Session, outMessage: Any): Unit {if (let Some(text) <- outMessage as String) {// 直接发给下个IoFilter处理context.offerMessage(text)} else {let exception = Exception("Only accept string message")context.exceptionCaught(exception)}}public func processOutboundException(context: IoFilterContext, session: Session, ex: Exception): Unit {context.exceptionCaught(ex)}public func toString() {return "ClientHanlder"}
}

编写一个将字符串转换为二进制数组的IoFilter,由于hyperion.transport.ByteAndStringCodec已经实现该功能,可以直接选用ByteAndStringCodec
编写一个给二进制数组添加报文长度的IoFilter,由于hyperion.transport.LengthBasedFrameCodec已经实现该功能,可以直接选用LengthBasedFrameCodec

3.4.4 编写TCP客户端

编写服务端,并添加编解码和调用服务使用的IoFilter:

    let config = ClientEndpointConfig()config.host = "127.0.0.1"config.port = 8090// 客户端使用的线程池let threadPool = ThreadPoolFactory.createThreadPool(3, 128, 4096, Duration.minute * 2)// 创建客户端Endpointlet tcpEndpoint = ClientTcpEndpoint(config, threadPool)// 使用4字节记录报文长度的编解码器let lengthFrameEncoder = LengthBasedFrameEncoder(4)let lengthFrameDecoder = LengthBasedFrameDecoder(4)// 判断报文是否包含完整消息的MessageCompletedHandlertcpEndpoint.setMessageCompletedHandler(lengthFrameDecoder)// 解析报文长度的IoFiltertcpEndpoint.addFilter(LengthBasedFrameCodec(lengthFrameEncoder, lengthFrameDecoder))// 字符串和二进制数组转换的IoFiltertcpEndpoint.addFilter(ByteAndStringCodec())// 接收消息并缓存消息到队列中的IoFilterlet clientHandler = ClientHandler()tcpEndpoint.addFilter(clientHandler)// 启动客户端EndpointtcpEndpoint.start()// 创建会话,并使用会话发送消息try (session = tcpEndpoint.createSession()) {// 发送消息,并收取对应的响应for (i in 1..=100) {let message = "Message${i}"println("Send message: ${message}")session.writeAndFlushMessage(message)let receiveMsg = clientHandler.takeMessage()println("Client receive message: ${receiveMsg}")}}

以上就是本篇文章所带来的鸿蒙开发中一小部分技术讲解;想要学习完整的鸿蒙全栈技术。可以在结尾找我可全部拿到!
下面是鸿蒙的完整学习路线,展示如下:
在这里插入图片描述
在这里插入图片描述
除此之外,根据这个学习鸿蒙全栈学习路线,也附带一整套完整的学习【文档+视频】,内容包含如下

内容包含了:(ArkTS、ArkUI、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、鸿蒙南向开发、鸿蒙项目实战)等技术知识点。帮助大家在学习鸿蒙路上快速成长!

鸿蒙【北向应用开发+南向系统层开发】文档笔记

在这里插入图片描述

鸿蒙【基础+实战项目】视频

在这里插入图片描述

鸿蒙面经

在这里插入图片描述
为了避免大家在学习过程中产生更多的时间成本,对比我把以上内容全部放在了↓↓↓想要的可以自取喔!谢谢大家观看!

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

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

相关文章

基于Windows系统和linux系统,实现samba文件共享服务,

1.设置IP地址&#xff1a; vim /etc/sysconfig/network-scripts/ifcfg-ens33 2.关闭防火墙和selinux [roots ~]# systemctl stop firewalld [roots ~]# systemctl disable firewalld [roots ~]# vim /etc/selinux/config [roots ~]# setenforce 0 [roots ~]# 3.重启网络服…

Adobe国际认证详解-职业发展规划指南

Adobe国际认证&#xff0c;又称为Adobe Certified Professional&#xff08;简称ACP&#xff09;&#xff0c;是Adobe公司CEO签发的权威国际认证体系。这一认证体系基于Adobe核心技术及岗位实际应用操作能力的测评&#xff0c;旨在为用户提供创意软件的专业认证。 Adobe国际认证…

设计分享—国外医疗行业界面设计

医疗诊断界面是一个直观且信息丰富的数字平台&#xff0c;它集成了患者基本信息、病史记录、当前症状描述、检查结果展示以及智能诊断建议等功能于一体。 界面设计简洁明了&#xff0c;便于医生快速浏览关键信息&#xff0c;同时利用先进的算法辅助医生进行精准诊断&#xff0…

dou dian滑块captchaBody

声明(lianxi a15018601872) 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 前言(lianxi a…

最短路径 | 743. 网络延迟时间之 Dijkstra 算法和 Floyd 算法

目录 1 基于 Dijkstra 算法1.1 代码说明1.2 完整代码 2 基于 Floyd 算法2.1 代码说明2.2 完整代码 前言&#xff1a;我在做「399. 除法求值」时&#xff0c;看到了基于 Floyd 算法的解决方案&#xff0c;突然想起来自己还没有做过最短路径相关的题。因此找来了「743. 网络…

【黑马java基础】特殊文件,日志

目录 特殊文件&#xff1a;Properties属性文件特点、作用使用Properties读取属性文件里的键值对数据使用properties把键值对数据写到属性文件中去案例 特殊文件&#xff1a;XML文件概述读取XML文件中的数据把数据写出到XML文件中去补充知识&#xff1a;约束XML文件的编写[了解]…

HarmonyOS 本地真机运行

目录 官网地址 1.开发工具设置签名 2.手机开启开发者模式 3.使用USB连接方式 4.使用无线调试连接方式 5.常见的问题 官网地址 使用真机运行应用 使用本地真机运行应用/服务 1.开发工具设置签名 官网应用/服务签名 1.左上角文件--项目结构-勾选自动生成签名-Sign in登录 2…

Apache2服务介绍

apache2 安装使用配置web访问配置虚拟主机配置代理正向代理反向代理 官网 互联网上排名第一的 HTTP 服务器&#xff0c;Apache HTTP 服务器项目致力于开发和维护适用于现代操作系统&#xff08;包括 UNIX 和 Windows&#xff09;的开源 HTTP 服务器。该项目的目标是提供安全、…

【译】设计已死

文章概括&#xff1a; 本文探讨了人工智能&#xff08;AI&#xff09;的崛起如何可能使设计师甚至设计本身变得过时。作者借用尼采的名言“上帝已死”&#xff0c;引出设计在AI时代面临的困境&#xff0c;并分析了 AI 对设计行业的深远影响。 思维导图&#xff1a; 人类创造的…

GPT模型为什么能生成有意义的文本

GPT模型的底层&#xff0c;其实是谷歌团队推出的Transformer模型。但是在GPT-3出现之前&#xff0c;大家一直对它没有多少了解。直到它的参数数量突破1750亿个的时候&#xff0c;它才建立起一个庞大的神经网络&#xff0c;这个神经网络最突出的特点是大数据、大模型和大计算。其…

书生浦语多模态简述——学习笔记

多模态学习概念 多模态它是研究异构且相互连接数据的科学。它涵盖了从原始的器官信号到抽象概念的多种模态。 比如说我们语音和语言是我们理解人类交流的关键模态&#xff0c;而情感和图像就为我们提供了对环境和对象的感知&#xff0c;通过分析这些模态&#xff0c;我们就可…

技术成神之路:设计模式(九)观察者模式

介绍 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为设计模式。它允许一个对象&#xff08;称为主题或可观察者&#xff09;来监视并通知一组依赖于这个对象的其他对象&#xff08;称为观察者&#xff09;&#xff0c;以便在主题状态发生变化时自动更新观察者的…

Python中高效处理大数据的几种方法

随着数据量的爆炸性增长&#xff0c;如何在Python中高效地处理大数据成为了许多开发者和数据科学家的关注焦点。Python以其简洁的语法和丰富的库支持&#xff0c;在数据处理领域占据了重要地位。本文将介绍几种在Python中高效处理大数据的常用方法。 目录 1. 使用Pandas进行数…

双向链表(C语言版)

1. 双向链表的结构 注意&#xff1a;这里的“带头”跟单链表的“头结点”是两个概念&#xff0c;实际上在单链表阶段称呼不太严谨&#xff0c;但是为了更好地理解就直接称为单链表的头结点。带头链表里的头结点&#xff0c;实际为“哨兵位”&#xff0c;哨兵位结点不存储任何有…

若依Vue前后端分离版如何部署(windows)(超详细)

一、项目环境准备 下面是项目所需要准备的环境 Node.js redis 1、Node.js下载 下面进入官网可以下载Node.js — 在任何地方运行 JavaScript (nodejs.org)https://nodejs.org/zh-cn 下载完成安装后&#xff0c;需要配置环境变量&#xff0c;首先复制以下nodejs的安…

【JavaScript】箭头函数

具体讲解 之前写 this 的指向时就提到过箭头函数&#xff0c;但是由于其比较复杂&#xff0c;还是单独开一篇来讲箭头函数。 箭头函数&#xff0c;箭头函数不能作为构造函数&#xff0c;没有原型 prototype&#xff0c;不能 new。 在箭头函数中&#xff0c;this 关键字指向的是…

代码随想录Day15|| 110平衡二叉树 257二叉树的所有路径 404左叶子之和 222完全二叉树的节点个数

110平衡二叉树 力扣题目链接 题目描述 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,3,3,null,null,4,4] 输出&#xff…

深入浅出WebRTC—GCC

GoogCcNetworkController 是 GCC 的控制中心&#xff0c;它由 RtpTransportControllerSend 通过定时器和 TransportFeedback 来驱动。GoogCcNetworkController 不断更新内部各个组件的状态&#xff0c;并协调组件之间相互配合&#xff0c;向外输出目标码率等重要参数&#xff0…

昇思25天学习打卡营第17天|计算机视觉

昇思25天学习打卡营第17天 文章目录 昇思25天学习打卡营第17天ShuffleNet图像分类ShuffleNet网络介绍模型架构Pointwise Group ConvolutionChannel ShuffleShuffleNet模块构建ShuffleNet网络 模型训练和评估训练集准备与加载模型训练模型评估模型预测 打卡记录 ShuffleNet图像分…

2023 N1CTF-n1proxy

文章目录 参考rsa握手rust_proxy源码公匙交换和签名会话钥匙后续通信生命周期和裸指针代码审计漏洞点 libc-2.27.so大致思路&#xff08;exp还有变化&#xff09;调试exp泄露libc写free_hook执行命令exp 参考 https://github.com/Nu1LCTF/n1ctf-2023/tree/main/pwn/n1proxy ht…