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

【上回战况】

上回做到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


你可能感兴趣的:(服务器,设计,实例,工厂模式)