[서버 프로그래밍] 내 서버를 위해 삽을 사다

[전회 전황]
지난번에 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를 구현하였으니 당연히 실례화될 수 있습니다.그럼 X서버에서 이 서비스를 어떻게 호출합니까?추상적인 공장 모델은 다음과 같다.
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
"); int ret = base->Respond(text, textlen); if (base) { delete base; base = nullptr; } return ret; }

Respond는 허함수로서 당연히 서로 다른 서비스 클래스가 서로 다른 실현을 할 수 있다.
【QT 서버 성장 상황】
① 공구가 있으면 흙을 파서 이 일을 할 수 있다.테이프는 다른 일을 할 수 없습니다. 왜냐하면 저는 현재 파일 전송만 실현했기 때문입니다.
【Github】
https://github.com/jammgit/LearnPlatformBaseQt

좋은 웹페이지 즐겨찾기