您的位置:首页 > 编程语言

【服务器编程】为我的服务器买铲子

2016-04-19 02:43 281 查看
【上回战况】

上回做到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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: