目录
一、概述
kikilib网络库是轻量,高性能,纯c++11,更符合OOP语言特点且易于使用的一个Linux服务器网络库。并发模型使用的是Reactor模型+非阻塞IO,坚持One Loop One Thread,基于反馈的负载均衡策略派发新连接。
什么是面向对象使用的网络库呢?
之前我们使用的网络库一般都是写一个回调函数,然后set_callback进网络库中,并配合context上下文指针使用。但是在c++中,为何不直接写一个类作为回调函数和上下文成员共同的载体呢,其中上下文的内容作为private成员(这也是符合语义的),回调函数作为类的成员函数,这样做也更符合C++这个OOP语言的特点,何乐而不为。基于这个想法,我写了这个网络库。
Github源码地址: https://github.com/YukangLiu/kikilib
老哥们顺便去给个star呗~
二、使用
这个网络库的使用非常简单,只需要实现一个EventService子类就可以了。以我的echo为例:
class EchoService : public kikilib::EventService
{
public:
EchoService(kikilib::Socket sock, kikilib::EventManager* evMgr)
: EventService(sock, evMgr)
{ };
~EchoService() {};
void handleReadEvent()
{
std::string str = readAll();
sendContent(std::move(str));
forceClose();
};
};
int main()
{
kikilib::EventMaster<EchoService> evMaster;
evMaster.init(4, 80);
evMaster.loop();
return 0;
}
从头到尾都不需要设置回调函数和对应一个连接的上下文指针。
使用这个网络库的核心是一个EventService类,提供了一些供用户使用的API,还有几个处理各种事件的虚函数。这个类可以理解成“为一个连接中的各种事件服务”的类,用户继承这个类,上下文记录信息作为该类的私有成员,实现要处理的事件的处理函数即可。
这里就会出现一个问题,网络库如何实例化用户的这个对象呢?有两种方法,一是使用模板,二是使用工厂。这里我选择了将两种方式融合,即用户只需要将自己实现的具体EventService子类放在EventMaster的模板中就可以使用了,而在网络库内部是用工厂生产对象的。这样做的原因如下:第一,如果让用户再去实例化一个工厂那使用起来太麻烦了,这个是主要原因。第二,那为何还要加入工厂呢,因为将生产对象这个动作剥离出来的话,可以让类的职责更加分明,未来需要加入EventService对象池的话可以嵌到工厂中。
具体的使用方法可以参看http和chatroom,分别是我用这个库实现的一个简单的静态网页服务器和一个聊天室(广播)服务器。
http的测试站点:http://www.liuyukang.com/
三、实现
1、框架
模型如下:
大体上可以说是Reac