【仓颉三方库】 网络组件——hyperion

Hyperion: 一个支持自定义编解码器的TCP通信框架

特性

  1. 支持自定义编解码器
  2. 高效的ByteBuffer实现,降低请求处理过程中数据拷贝
  3. 自带连接池支持,支持连接重建、连接空闲超时
  4. 易于扩展,可以积木式添加IoFilter处理入栈、出栈消息

组件

  1. hyperion.buffer: 支持扩容的ByteBuffer实现
  2. hyperion.logadapter:支持打印异常堆栈的日志实现,可以适配第三方日志系统
  3. hyperion.objectpool:对象池实现
  4. hyperion.threadpool:线程池实现
  5. hyperion.transport:支持自定义编解码器的TCP通信框架

Redis仓颉语言客户端SDK: redis-sdk 项目使用了该TCP框架,并实现了RESP2、RESP3协议的编解码。
ActiveMQ仓颉语言客户端SDK:acitvemq4cj项目使用了该TCP框架。

1. 编译和测试

工程目录结构

|---samples  使用Hyperion TCP框架的示例目录
|---src      Hyperion TCP框架的源码目录
|---module.json
|---README.md

1.1 编译步骤

清理工程,在工程根目录下运行:
$> cjpm clean

编译工程,在工程根目录下运行:
$> cjpm build

编译的静态库位于:
build/release/hyperion/hyperion.buffer.cjo
build/release/hyperion/hyperion.logadapter.cjo
build/release/hyperion/hyperion.objectpool.cjo
build/release/hyperion/hyperion.threadpool.cjo
build/release/hyperion/hyperion.transport.cjo

1.2 单元测试

在工程根目录下运行:
$> cjpm test

1.3 运行示例程序

编译服务端示例程序,在samples/echo_server目录下运行:
$> cjpm build

启动服务端,在samples/echo_server目录下运行:
$>./build/release/bin/main

编译客户端示例程序,在samples/echo_client目录下运行:
$> cjpm build

启动服务端,在samples/echo_client目录下运行:
$>./build/release/bin/main

2. 架构

2.1 Hyperion TCP框架的架构

Hyperion TCP框架的架构图如下:

MessageCompletedHandler接口

用于判断消息的报文是否读取完整,提供如下方法:
func messageCompleted(buffer: ByteBuffer, status: MessageCompletedStatus): Unit

Session接口

单向会话接口,可以向对端发送消息

IoSession接口

双向会话接口,可以从对端收取消息,也可以向对端发送消息

IoFilter接口

对TCP框架客户端或者服务端的入栈消息、出栈消息进行加工,提供如下方法:
func inboundMessage(context: IoFilterContext, session: Session, inMessages: ArrayList): Unit
func outboundMessage(context: IoFilterContext, session: Session, outMessages: ArrayList): Unit

SingularMessageIoFilter类

只处理单个入栈消息和单个出栈消息的IoFilter实现

IoFilterChain类

由IoFilter串联而成的链表

Connection接口

TCP框架客户端和服务端之间建立的连接

ConnectionInitializer接口

用于客户端和服务端初始化TCP连接,提供如下方法:
func initialize(session: Session): Unit

EventLoopHandler类

TCP框架客户端或者服务端的事件处理器,循环处理入栈消息,并按需要将消息出栈

### 仓颉输入法动态库或链接库的使用与下载资源 仓颉输入法作为一种基于编码规则的中文输入方法,其相关的动态库或链接库主要用于支持程序开发中的文本处理功能。以下是对仓颉输入法动态库或链接库的使用方法及下载资源的相关说明: #### 动态库与链接库的概念 动态库(Dynamic Library)和链接库(Linking Library)是编程中常用的两种库文件形式。动态库通常以 `.so`(Linux/Unix)、`.dll`(Windows)或 `.dylib`(macOS)为扩展名,而静态链接库则以 `.a` 或 `.lib` 为扩展名。这些库文件包含预编译的代码,可以被多个应用程序共享使用[^2]。 #### 仓颉输入法相关动态库的下载资源 目前,仓颉输入法本身并没有官方发布的独立动态库或链接库,但可以通过一些开源项目获取其实现逻辑并自行编译生成动态库。以下是几个可能的资源方向: 1. **Rime 输入框架** Rime 是一个开源的输入法框架,支持多种编码输入法,包括仓颉输入法。用户可以从 Rime 的官方 GitHub 仓库下载源码,并根据需要编译生成动态库。Rime 的 GitHub 地址为:https://github.com/rime[^1]。 2. **仓颉码表资源** 在实现仓颉输入法时,码表是一个关键资源。Rime 官方提供了仓颉码表的实现,可以在以下地址找到:https://github.com/rime/rime-cangjie[^1]。 3. **第三方实现** 某些开发者可能基于 Rime 或其他框架实现了仓颉输入法的动态库。可以通过搜索引擎查找类似“仓颉输入法 动态库 下载”等关键词,访问相关论坛或社区获取资源。 #### 动态库的使用方法 在获取到仓颉输入法的动态库后,可以通过以下步骤进行使用: 1. **加载动态库** 使用语言提供的动态库加载机制加载库文件。例如,在 C/C++ 中可以使用 `dlopen` 函数加载 `.so` 文件。 ```c #include <dlfcn.h> void* handle = dlopen("librime.so", RTLD_LAZY); if (!handle) { fprintf(stderr, "%s\n", dlerror()); exit(EXIT_FAILURE); } ``` 2. **调用库函数** 加载成功后,通过 `dlsym` 获取函数指针并调用。例如: ```c typedef void (*InitFunc)(); InitFunc init = (InitFunc)dlsym(handle, "rime_init"); if (!init) { fprintf(stderr, "%s\n", dlerror()); dlclose(handle); exit(EXIT_FAILURE); } init(); ``` 3. **释放动态库** 使用完成后,调用 `dlclose` 释放动态库资源: ```c dlclose(handle); ``` #### 注意事项 - 动态库的使用需要确保目标平台支持相应的库文件格式。 - 如果需要对仓颉输入法的功能进行扩展或修改,建议从源码入手,自行编译生成动态库。 - 在某些情况下,可能需要额外安装依赖库以支持动态库的正常运行。 ```python # 示例:Python 中加载动态库 import ctypes lib = ctypes.CDLL('./librime.so') lib.rime_init() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值