一、前言
软件使用纯C环境编写,没有调用第三方库,直接使用交叉编译工具编译,就可以移植到嵌入式linux环境中。软件在TCP协议基础上简易实现了HTTP的GET和POST方法,还有websocket协议。服务器增加了线程池和数据库连接池功能,提高系统的并发性;服务器还包含日志功能,记录程序运行时的状态。开源地址:https://github.com/jiangbfy/chttp-server
二、HTTP功能
- GET方法
- 查询用户信息
url:/user/info
用postman测试结果如下:图1 查询用户信息 - 执行uname命令
url:/cmd/uname图2 获取服务器信息
- 查询用户信息
- POST方法
- 添加用户
url:/user/add
parameter:{“user”: “rk3588”,“passwd”: “rk3588”,“time”: “2024-7-5 12:22:46”}
用postman测试结果如下:图3 添加用户再次查询用户信息,即可看到最新一条刚刚新增的数据:图4 查询用户信息
- 添加用户
二、WebSocket功能
websocket功能测试本人在一个新工程中导入reconnecting-websocket
模块,然后连接服务器,将接收到的数据打印到控制台:
图5 前端websocket测试代码
测试结果如下:
图6 前端websocket测试结果
三、日志功能
日志分为4个等级:debug,info,warn和error。日志文件以XX_XX_XX的年月日形式保存,保存到工作路径的logs目录下。
图7 日志记录
四、其他
- 程序使用了线程池,提高系统响应速度
- 使用二叉树管理tcp连接,键值是sockfd,提高查找速度
- 使用epoll(IO多路复用),socket设置为非阻塞
- 使用数据库连接池,因为sqlite3直接对数据库文件进行操作,不支持多个连接,所以数量为1
五、编译运行
- 服务器环境
- ubuntu18.04(可交叉编译,arm开发板中运行)
- 测试环境
- postman
- 数据库初始化
CREATE TABLE userinfo (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user TEXT NOT NULL,
passwd TEXT NOT NULL,
time TEXT NOT NULL
);
- 配置
- 在main.c中配置服务器端口号,数据库名和线程池数量
- 编译
- 运行
make
- 新建目录
logs
- 运行
./server
- 运行