当前位置: 首页 > news >正文

使用仓颉开发一个简单的http服务

使用仓颉开发一个简单的http服务

  • linux下安装仓颉
    • 新建项目
    • 运行一下
    • 构建一下
    • 引入stdx
    • 编写代码
  • 改造
    • 增加controller/user.cj
    • 在main.cj中使用
    • 构建
    • nginx代理

linux下安装仓颉

之前在windows下体验了下。

linux安装文档

tar xvg cangjie-sdk-linux-x64-1.0.1.tar.gz

等待完成后
执行

source cangjie/envsetup.sh

验证

cjc -v

在这里插入图片描述

新建项目

新建一个文件夹,初始化cjpm项目

cjpm init

在这里插入图片描述
和我们之前在windows的是一样的。

运行一下

cjpm run

在这里插入图片描述

构建一下

cjpm build

在这里插入图片描述
那么构建完成后,如何运行呢?
进入bin目录下。看到有一个可执行文件,main。执行它。
在这里插入图片描述

引入stdx

下载构建好的stdx
https://gitcode.com/Cangjie/cangjie-stdx-bin/releases?isLogin=1
根据你的型号选择,如果你不知道,可以执行cjc -v
比如我的
在这里插入图片描述

在这里插入图片描述
下载完成后,解压。
在cjpm.toml引入使用。
stdx使用文档

这里的target.后面的就是你执行cjc -v 获取到的。如上。
"${CANGJIE_STDX_PATH}"换成你的stdx的解压路径。

[target.x86_64-unknown-linux-gnu][target.x86_64-unknown-linux-gnu.bin-dependencies]path-option = ["${CANGJIE_STDX_PATH}"]

比如我的
在这里插入图片描述

[package]cjc-version = "1.0.1"name = "pj1"description = "nothing here"version = "1.0.0"target-dir = ""src-dir = ""output-type = "executable"compile-option = ""override-compile-option = ""link-option = ""package-configuration = {}[dependencies][target.x86_64-unknown-linux-gnu][target.x86_64-unknown-linux-gnu.bin-dependencies]path-option = ["/www/cj/pj1/linux_x86_64_llvm/dynamic/stdx"]

编写代码

package pj1
import stdx.net.http.*
import stdx.log.*// 1. 构建 Server 实例
let server = ServerBuilder().addr("127.0.0.1").port(3000).build()func startServer(): Unit {// 2. 注册请求处理逻辑server.distributor.register("/hello", {httpContext =>httpContext.responseBuilder.body("Hello Cangjie!")})server.logger.level = LogLevel.OFF// 3. 启动服务server.serve()
}main () {spawn {startServer()}sleep(Duration.second)// 主线程无限休眠,不退出(进程保持存活,服务器持续监听)while (true) {sleep(Duration.second * 3600)  // 每小时醒一次,继续循环}
}

测试请求
在这里插入图片描述

改造

src下新增目录
scr/controller/
新增文件
src/controller/user.cj

增加controller/user.cj

package pj1.controller
import stdx.net.http.*public func UserController (distributor:HttpRequestDistributor) {distributor.register("user", {httpContext =>let request = httpContext.requestlet username = request.form.get("username")httpContext.responseBuilder.body("{'code':2000,'message':'注册成功,欢迎您 ${username}'}")})
}

在main.cj中使用

package pj1
import stdx.net.http.*
import stdx.log.*
import pj1.controller as Controller// 1. 构建 Server 实例
let server = ServerBuilder().addr("0.0.0.0").port(3000).build()func startServer(): Unit {Controller.UserController(server.distributor);// 2. 注册请求处理逻辑server.distributor.register("/hello", {httpContext =>httpContext.responseBuilder.body("Hello Cangjie!")})server.logger.level = LogLevel.OFF// 3. 启动服务server.serve()
}main () {spawn {startServer()}sleep(Duration.second)// 主线程无限休眠,不退出(进程保持存活,服务器持续监听)while (true) {sleep(Duration.second * 3600)  // 每小时醒一次,继续循环}
}

启动
cjpm run

请求
在这里插入图片描述

构建

cjpm build
在这里插入图片描述
target/release/bin/目录下
新增脚本 start.sh

#!/bin/bash# 配置区:修改为你的目标执行文件路径
TARGET_EXEC="./main"  # 要运行的文件(绝对路径或相对路径)
LOG_FILE="./process.log"      # 程序输出日志
PID_FILE="./process.pid"      # 进程PID记录文件# 检查进程是否运行
is_running() {if [ -f "$PID_FILE" ]; thenlocal pid=$(cat "$PID_FILE")# 检查PID对应的进程是否存在if ps -p "$pid" > /dev/null 2>&1; thenreturn 0  # 运行中elserm -f "$PID_FILE"  # PID文件存在但进程已死,清理文件fifireturn 1  # 未运行
}# 启动进程(后台运行)
start_process() {if is_running; thenecho "程序已在运行中(PID: $(cat "$PID_FILE"))"return 0fi# 后台启动程序,重定向输出到日志,记录PIDnohup "$TARGET_EXEC" > "$LOG_FILE" 2>&1 &local pid=$!  # 获取后台进程PIDecho "$pid" > "$PID_FILE"echo "程序已启动(PID: $pid),日志文件: $LOG_FILE"
}# 停止进程(强制终止)
stop_process() {if ! is_running; thenecho "程序未在运行"return 0filocal pid=$(cat "$PID_FILE")kill "$pid"  # 发送终止信号# 等待进程退出(最多等5秒)for i in {1..5}; doif ! ps -p "$pid" > /dev/null 2>&1; thenrm -f "$PID_FILE"echo "程序已停止(PID: $pid)"return 0fisleep 1done# 如果5秒后仍未退出,强制杀死kill -9 "$pid"rm -f "$PID_FILE"echo "程序已强制停止(PID: $pid)"
}# 暂停进程(发送暂停信号)
pause_process() {if ! is_running; thenecho "程序未在运行"return 0filocal pid=$(cat "$PID_FILE")# 发送暂停信号(SIGSTOP)kill -19 "$pid"echo "程序已暂停(PID: $pid)"
}# 恢复进程(发送继续信号)
resume_process() {if ! is_running; thenecho "程序未在运行"return 0filocal pid=$(cat "$PID_FILE")# 发送继续信号(SIGCONT)kill -18 "$pid"echo "程序已恢复运行(PID: $pid)"
}# 重启进程(先停止再启动)
restart_process() {echo "正在重启程序..."stop_processstart_process
}# 查看进程状态
status_process() {if is_running; thenlocal pid=$(cat "$PID_FILE")# 检查进程是否处于暂停状态local state=$(ps -p "$pid" -o state --no-headers)if [ "$state" = "T" ]; thenecho "程序状态:暂停中(PID: $pid)"elseecho "程序状态:运行中(PID: $pid)"fielseecho "程序状态:未运行"fi
}# 帮助信息
show_help() {echo "用法: $0 [命令]"echo "命令列表:"echo "  start    - 启动程序(后台运行)"echo "  stop     - 停止程序"echo "  restart  - 重启程序"echo "  pause    - 暂停程序"echo "  resume   - 恢复暂停的程序"echo "  status   - 查看程序状态"echo "  help     - 显示帮助信息"
}# 解析参数
case "$1" instart)start_process;;stop)stop_process;;restart)restart_process;;pause)pause_process;;resume)resume_process;;status)status_process;;help)show_help;;*)echo "未知命令: $1"show_helpexit 1;;
esac

执行

./start.sh start

nginx代理

简单配置
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

http://www.dtcms.com/a/516092.html

相关文章:

  • 企业网站托管后果网站建设营销外包公司排名
  • 在linux系统中使用通用包安装 Mysql
  • DeepSeek OCR:重新定义AI文档处理的“降本增效”新范式
  • JAVAEE阶段学习指南
  • 针对stm32f103 MCU的延时方法及函数深入探讨
  • 【完整源码+数据集+部署教程】【天线&水】舰船战舰检测与分类图像分割系统源码&数据集全套:改进yolo11-repvit
  • 查找算法-顺序查找
  • Linux系统中CoreDump的生成与调试
  • 关于数据库和分库分表
  • 服务器和网站空间云端设计高端网站建设
  • yolo v11 pose 推理部署实战 2025
  • 设计模式之:装饰器模式
  • 用户态和内核态切换开销详解(了解即可)
  • Android触屏TP驱动事件上报以及多点触摸
  • 上海微信小程序网站建设教做西餐的网站
  • 一文读懂YOLOv4:目标检测领域的技术融合与性能突破
  • 深圳企业网站建设报价泰安建设网站
  • vllm系统架构图解释
  • 上海做网站公司做网站的公司免费域名注册工具
  • 博客安全攻防演练技术指南
  • IMX8MP交叉编译QT 5.12.9
  • 通过datax将mysql数据导入到clickhouse
  • 湛江网站网站建设长沙网络推广平台
  • 平顶山市网站建设校际凡科平台是干什么的
  • 突破机房边界!VMware虚拟机结合cpolar远程协作实战指南
  • 微算法科技(NASDAQ MLGO)创建企业级区块链双层共识算法:融合优化DPoS与动态BFT的协同机制设计
  • Redis深度探索
  • 做金融的看哪些网站店铺设计分析
  • 【机器学习07】 激活函数精讲、Softmax多分类与优化器进阶
  • 香水推广软文seo入门教学