【上回战况】
上回做到Xserver超级服务就完了;控制逻辑、控制和具体服务的桥梁已经基本实现,当然还有很多细节需要处理的。不知道的同志可以翻上去看看哦。下面,我要为我的服务器添加具体服务,那要怎么做?
【最新战况】
因为不同的服务有一个共同点,那就是都是一个通信(好像说了废话嘿)。根据这种想法,我想到了抽象工厂模式,绝对是不能在XServer超级服务类硬编码的哦,虽然我资历浅,但我知道那个坑肯定很深。怎么设计呢?以文件下载,上传等服务为例,我定义了一个服务的基类:
/* * 抽象工厂,所有服务类型的抽象基类 */ class BaseServer { public: BaseServer(int connfd) : m_connfd(connfd) {}; virtual int Respond(char *reqtext, int textlen) = 0; protected: int m_connfd; };注意,这个抽象基类,我只能说,抽象基类和抽象工厂模式是永恒不变的好基友。下面继承一个文件服务类:
class FileServer : public BaseServer { public: FileServer(int connfd, short msgtype) :BaseServer(connfd), m_MsgType(msgtype) {}; int Respond(char *reqtext, int textlen); private: short m_MsgType; };
class XServer { private: int m_connfd; public: XServer(int connfd):m_connfd(connfd) {}; /* 进程将剩余任务交给子进程,然后自己立刻回到epoll_wait状态 */ int Process() { while (1) { nRead = recv(m_connfd, (char *)&msg, sizeof(msgPack), 0); //① ... /* 开始处理事件 */ switch(ntohs(msg.type)) { /* 文件服务 */ case XXX: nRead = subProcess(new FileServer(m_connfd, msg.type), msg.text, strlen(msg.text)); break; default: break; } } } private: /* 抽象工厂!分用函数,text为用户请求文本 */ int subProcess(BaseServer *base, char *text, int textlen); };注意上面①处,因为项目自定义了通信的数据结构,所以请求属于哪种信息固然要我们自己处理,所以 我决定在Xserver的Process分用信息,然后将具体请求分发给不同的类(分用的过程绝不允许在具体服务类里实现哦,从对象的角度考虑,那部分工作本来就不应该属于这个服务类嘛)。函数subProcess的第一个参数为指向所有服务类的基类指针,那么就能利用多态性质啦,实现如下:
int XServer::subProcess(BaseServer *base, char *text, int textlen) { printf("subProcess\n"); int ret = base->Respond(text, textlen); if (base) { delete base; base = nullptr; } return ret; }
【QT服务器成长状况】
①有工具了,可以挖泥这项工作啦。带不能做其它事情,因为我目前只实现了文件传输嘛
【Github】
https://github.com/jammgit/LearnPlatformBaseQt