【服务器编程】为我的服务器买铲子
2016-04-19 02:43
281 查看
【上回战况】
上回做到Xserver超级服务就完了;控制逻辑、控制和具体服务的桥梁已经基本实现,当然还有很多细节需要处理的。不知道的同志可以翻上去看看哦。下面,我要为我的服务器添加具体服务,那要怎么做?
【最新战况】
因为不同的服务有一个共同点,那就是都是一个通信(好像说了废话嘿)。根据这种想法,我想到了抽象工厂模式,绝对是不能在XServer超级服务类硬编码的哦,虽然我资历浅,但我知道那个坑肯定很深。怎么设计呢?以文件下载,上传等服务为例,我定义了一个服务的基类:
FileServer服务类实现了函数Respond,当然就能被实例化了。那么在Xserver如何调用这个服务呢。抽象工厂模式实现如下:
而Respond是一个虚函数,当然是不同的服务类会有不同的实现。
【QT服务器成长状况】
①有工具了,可以挖泥这项工作啦。带不能做其它事情,因为我目前只实现了文件传输嘛
【Github】
https://github.com/jammgit/LearnPlatformBaseQt
上回做到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; };
FileServer服务类实现了函数Respond,当然就能被实例化了。那么在Xserver如何调用这个服务呢。抽象工厂模式实现如下:
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; }
而Respond是一个虚函数,当然是不同的服务类会有不同的实现。
【QT服务器成长状况】
①有工具了,可以挖泥这项工作啦。带不能做其它事情,因为我目前只实现了文件传输嘛
【Github】
https://github.com/jammgit/LearnPlatformBaseQt
相关文章推荐
- 【服务器编程】服务器编程实现逻辑和超级服务
- ThinkPHP3.2.3学习笔记3---视图
- [JAVA]Listener监听模式的学习
- PHP mysqli连接MySQL数据库
- java的访问权限
- 2016/04/18 session cookie 对比 应用 <?php session_start() / setcookie()?>
- git历史版本修改合并到主分支
- POJ 2007 Scrambled Polygon(极角排序)
- leetcode笔记:Remove Linked List Elements
- SpringMVC+Spring+Mybatis整合程序之整合
- 轻松入门Github
- Java学习笔记---IO流笔记
- spring,springmvc,mybatis基本整合(一)--xml文件配置方式(2)
- python 迭代器和生成器的区别
- 【C++】注册热键-RegisterHotKey
- 关于二叉树的二叉链表存储结构的两道题目
- Java 把一个文件夹中的所有文件复制到另一个文件夹中
- JAVA实现导出Excel(POI)
- TexturePacker code TP:E5673650
- PHP中use分析