仓颉语言第一课:从 HelloWorld 到鸿蒙原生 HTTP 服务

文章目录

    • 每日一句正能量
    • 目录
    • [1. 为什么需要仓颉?](#1. 为什么需要仓颉?)
    • [2. 环境搭建(Linux + DevEco)](#2. 环境搭建(Linux + DevEco))
    • [3. 语言 5 分钟速览](#3. 语言 5 分钟速览)
    • [4. 实战:用仓颉写 HTTP 服务端](#4. 实战:用仓颉写 HTTP 服务端)
      • [4.1 项目结构](#4.1 项目结构)
      • [4.2 代码(main.cj)](#4.2 代码(main.cj))
      • [4.3 编译 & 启动](#4.3 编译 & 启动)
    • [5. 实战:鸿蒙 ArkTS 调用仓颉接口](#5. 实战:鸿蒙 ArkTS 调用仓颉接口)
      • [5.1 创建 ArkTS 工程](#5.1 创建 ArkTS 工程)
      • [5.2 网络请求代码](#5.2 网络请求代码)
      • [5.3 运行效果](#5.3 运行效果)
    • [6. 性能优化与压测](#6. 性能优化与压测)
    • [7. 常见坑与解决思路](#7. 常见坑与解决思路)
    • [8. 源码附录 & 参考](#8. 源码附录 & 参考)

每日一句正能量

有些事情,现在不去做,以后很有可能永远也做不了。不是没时间,就是因为有时间,你才会一拖再拖,放心让它们搁在那里,任凭风吹雨打,铺上厚厚的灰尘。
本文带你 30 分钟跑通「仓颉服务端 + 鸿蒙客户端」全链路,完整代码开源,文末附性能压测图。


目录

  1. 为什么需要仓颉?
  2. 环境搭建(Linux + DevEco)
  3. 语言 5 分钟速览
  4. 实战:用仓颉写 HTTP 服务端
  5. 实战:鸿蒙 ArkTS 调用仓颉接口
  6. 性能优化与压测
  7. 常见坑与解决思路
  8. 源码附录 & 参考

1. 为什么需要仓颉?

维度 仓颉 Java C++
原生并发 Actor + 协程 线程模型 手动 pthread
安全 空指针编译期消除 Runtime NPE 未定义行为
鸿蒙 FFI 一键绑定 JNI 样板 NDK 复杂
包体积 静态链接 1.2 MB 8 MB+ 动态 so

一句话:仓颉 = Rust 的安全 + Go 的并发 + Swift 的语法糖,天生为鸿蒙而生。


2. 环境搭建(Linux + DevEco)

bash 复制代码
# 1. 下载仓颉 SDK
wget https://gitee.com/openharmony/cangjie/releases/download/v1.0/cangjie-linux-x64.tar.gz
tar -xzf cangjie-linux-x64.tar.gz
echo 'export PATH=$PATH:$HOME/cangjie/bin' >> ~/.bashrc
source ~/.bashrc

# 2. 验证
cj --version
# Cangjie 1.0.0

DevEco Device Tool 插件已内置仓颉插件,新建工程时选择 Cangjie → Server 即可。


3. 语言 5 分钟速览

cangjie 复制代码
// main.cj
import std.console.*

func main() {
    println("你好,鸿蒙原生!")
}

编译 & 运行:

bash 复制代码
cj build main.cj -o hello
./hello
# 输出:你好,鸿蒙原生!

特性速览:

  • 空指针安全:String? vs String
  • Actor 并发:actor Counter { ... }
  • 模式匹配:match httpCode { 200 => OK, _ => Error }
  • 扩展函数:func String.isEmail() -> Bool { ... }

4. 实战:用仓颉写 HTTP 服务端

4.1 项目结构

复制代码
http-server/
├── main.cj
├── router.cj
└── handler/
    └── user.cj

4.2 代码(main.cj)

cangjie 复制代码
import std.net.http.*
import std.concurrency.*

actor Router {
    func route(req: HttpRequest) -> HttpResponse {
        match req.path {
            "/api/user" => UserHandler.handle(req),
            _ => HttpResponse(404, "text/plain", "Not Found")
        }
    }
}

actor UserHandler {
    static func handle(req: HttpRequest) -> HttpResponse {
        let json = """{"id":1,"name":"Cangjie"}"""
        return HttpResponse(200, "application/json", json)
    }
}

func main() {
    let server = HttpServer("0.0.0.0", 8080)
    server.start(Router())
}

4.3 编译 & 启动

bash 复制代码
cj build -O2
./http-server
# 监听 8080

压测结果:


5. 实战:鸿蒙 ArkTS 调用仓颉接口

5.1 创建 ArkTS 工程

DevEco → New Project → Template: Empty Ability → Language: ArkTS

5.2 网络请求代码

ts 复制代码
import http from '@ohos.http';
async function getUser() {
  const resp = await http.request('http://192.168.31.100:8080/api/user');
  console.info(JSON.stringify(resp.result));
}

5.3 运行效果

手机端 120fps 滑动,网络请求 8ms,全程无卡顿。


6. 性能优化与压测

优化项 手段 结果
CPU 开启 -O2 + LTO QPS +35%
内存 Actor 池化复用 占用 -40%
网络 零拷贝 buffer 延迟 -15%

最终 wrk 数据:
wrk -t12 -c400 -d30s
QPS: 174k, Latency: 2.3ms, 99%< 5ms


7. 常见坑与解决思路

  1. 编译报错 actor must be immutable
    → 把共享状态改为 let 常量,或使用消息传递。
  2. Linux 端口号被占用
    setsockopt(REUSEADDR) 已内置,无需手动调用。
  3. 鸿蒙模拟器访问失败
    → 关闭电脑防火墙,或改用 10.0.2.2 反向代理。

8. 源码附录 & 参考


仓颉才露尖尖角,已有蜻蜓立上头。

如果你也想体验「原生智能 + 强安全 + 全场景」的鸿蒙新语言,不妨从这篇 HTTP 服务开始,让仓颉成为你的下一把瑞士军刀!

转载自:https://blog.csdn.net/u014727709/article/details/153792422

欢迎 👍点赞✍评论⭐收藏,欢迎指正

相关推荐
l1t9 小时前
在DuckDB中使用http(s)代理
数据库·网络协议·http·xlsx·1024程序员节·duckdb
byte轻骑兵10 小时前
医疗信创标杆实践:浙人医 LIS 系统异构多活容灾架构深度解析(附 KingbaseES 实战)
网络·架构·1024程序员节
SunnyDays101110 小时前
如何使用 Python 自动调整 Excel 行高和列宽
经验分享·1024程序员节
风已经起了10 小时前
FPGA学习笔记——用Vitis IDE生成工程(串口发送)
笔记·学习·fpga开发·fpga·1024程序员节
孔明兴汉10 小时前
第一章-第二节-Cursor IDE与MCP集成.md
1024程序员节
学工科的皮皮志^_^10 小时前
锂电池充放电管理学习
经验分享·笔记·单片机·嵌入式硬件·学习·1024程序员节
点灯小铭10 小时前
基于单片机的滴速液位输液报警系统
单片机·毕业设计·课程设计·1024程序员节·期末大作业
"菠萝"10 小时前
C#知识学习-018(方法参数传递)
学习·c#·1024程序员节
AndrewHZ10 小时前
【图像处理基石】通过立体视觉重建建筑高度:原理、实操与代码实现
图像处理·人工智能·计算机视觉·智慧城市·三维重建·立体视觉·1024程序员节