http全称超文本传输协议,可调试性高,扩展性也强。上两个篇章我们已经拥有了epoll事件驱动框架和线程池处理网络事件,接下来我们要先写一个基础网络套接字,然后在此基础上扩展出http的套接字。献上类图如下
完整源码见<https://github.com/kwansoner/panda.git>
可以看到我们有一个最顶层的基类ISocket,拥有一个方法fd返回描述符,增加这个接口时由于事件中心注册到epoll里需要int型的描述符。接下来在ISocket基础上派生出IServer与IClient两个基类。实例化出两个TCP类型的套接字类CStreamServer与CStreamClient。然后我们就可以组合的方式扩展出两个http套接字类,不用继承的原因是继承增加耦合,也没有必要用继承。由于HttpStream与HttpServer需要收听事件中心的事件回调,因此需要继承IEventHandle。
class ISocket
{
public:
virtual ~ISocket(){};
// desc: 获取套接字描述符
// param: void
// return: 套接字描述符
virtual int fd() = 0;
};
class IClient: public ISocket
{
public:
virtual ~IClient(){};
// desc: 打开套接字
// param: void
// return: 0/成功 -1/失败
virtual int start() = 0;
// desc: 关闭套接字
// param: void
// return: 0/成功 -1/失败
virtual int close() = 0;
// desc: 设置套接字为非阻塞
// param: block/是否非阻塞
// return: 0/成功 -1/失败
virtual int set_nonblock(bool nonblock) = 0;
// desc: 连接到server
// param: addr/server地址 port/端口
// return: 0/成功 -1/失败
virtual int connect(const std::string