项目介绍:实现了一个基于协程的服务器框架,支持多线程、多协程协同调度;支持以异步处理的方式提高服务器性能;封装了网络相关的模块,包括socket、http、servlet等,支持快速搭建HTTP服务器或WebSokcet服务器。
详细内容:日志模块,使用宏实现流式输出,支持同步日志与异步日志、自定义日志格式、日志级别、多日志分离等功能。线程模块,封装pthread相关方法,封装常用的锁包括(信号量,读写锁,自旋锁等)。IO协程调度模块,基于ucontext_t实现非对称协程模型,以线程池的方式实现多线程,多协程协同调度,同时依赖epoll实现了事件监听机制。定时器模块,使用最小堆管理定时器,配合IO协程调度模块可以完成基于协程的定时任务调度。hook模块,将同步的系统调用封装成异步操作(accept, recv, send等),配合IO协程调度能够极大的提升服务器性能。Http模块,封装了sokcet常用方法,支持http协议解析,客户端实现连接池发送请求,服务器端实现servlet模式处理客户端请求,支持单Reator多线程,多Reator多线程模式的服务器。
std::vector<int32_t> res;
johnsonli::ByteArray::ptr ba(new johnsonli::ByteArray(base_len));
for(int i = 0; i<len; ++i) {
res.push_back(rand());
}
for(auto &it : res) {
ba->writeFint32(it);
}
ba->setPosition(0); // 读之前偏移量要设置为0
for(auto it : res) {
int32_t val = ba->readFint32();
DO_ASSERT(it == val);
}
DO_ASSERT(ba->getReadSize() == 0);
LOG_INFO(g_logger) << "writeFint32/readFint32"
" (int32_t) len=" << len
<< " base_len=" << base_len
<< " size=" << ba->getSize(); struct Node
{
Node(size_t s); //构造指定大小的内存块
Node();
~Node();
char* ptr; //内存块地址指针
Node* next; //下一个内存块地址
size_t size; //内存块大小
};void writeFint8 (int8_t value); // 写入固定长度int8_t类型的数据
void writeFuint8 (uint8_t value); // 写入固定长度uint8_t类型的数据
// ... 16、32、64字节
void writeInt32 (int32_t value); // 压缩写入int32_t
void writeUint32 (uint32_t value); // 压缩写入uint32_t
// 64字节
void writeFloat (float value);
void writeDouble(float value);
void writeStringF16(const std::string& value); // 写入std::string类型的数据,用uint16_t作为长度类型
void writeStringWithoutLength(const std::string& value); // 不写长度
// ...
void readFint8 (int8_t value); // 读取固定长度int8_t类型的数据
void readFuint8 (uint8_t value); // 读取固定长度uint8_t类型的数据
// ... 16、32、64字节
void readInt32 (int32_t value); // 读取压缩的int32_t
void readUint32 (uint32_t value); // 读取压缩的uint32_t
// 64字节
...长度+string的编码发送方式类似于TLV编码