http服务器二次开发SDK
http服务器二次开发SDK
1. 概述
http协议能够将可见协议与二进制协议有效融合,并且其结构良好,分头域与实体两部分,而且头域的结构一致,并能够随意扩展。我们可以基于头域结构的形式,模拟MFC消息结构,设计一个高效,易扩展的解析架构。
本程序的设计初衷就是模拟MFC的消息机制来实现http头域的解析,并使得能够基于该结构实现私有协议的解析,实现http协议的基本框架,使得二次开发时能够基于该框架快速实现开发。使用C++开发网站,完全实现界面与数据分开,使得C++的程序员们也能够快速开发基于网页的程序。
如果需要基于本架构实现http协议的二次开发,首先需要花时间区了解下http协议的基本结构。
该系列的文章会持续发布,敬请关注。
2. 运行环境
目前提供的库运行在windows平台下,使用vs2008环境编译。后续会实现linux库。
3. 如何启动主程序
3.1. 一个简单的程序:
#include "../httpServer/ServerMain.h"
int _tmain(int argc, _TCHAR* argv[])
{
StartHttpServer(8082,NULL,1);
return 0;
}
该程序在8082端口上启动了一个http服务,这样在相应的工作目录上放入index.html或者其他文件就可以直接访问了。
在浏览器中输入:http://127.0.0.1:8082/就会出现index.html中显示的界面。
或者输入http://127.0.0.1:8082/指定文件名.
3.2. 实现自己的http
如果需要实现根据用户的请求参数返回不同的信息,就需要增加自己的逻辑处理。
我们的逻辑处理都放在一个对象中实现,以便多次请求能够保存同样的处理现场。所以我们首先需要实现创建处理对象。
#include "../httpServer/ServerMain.h"
#include "./client/MfhHttpClientTest.h"
int _tmain(int argc, _TCHAR* argv[])
{
StartHttpServer(8082,CreateMfhHttpClientTest,1);
return 0;
}
这段代码增加了回调函数CreateMfhHttpClientTest,用于创建与客户连接的client类。在该回调函数中创建对象,主要是为接管创建其他对象做准备。
代码如下:
MfhHttpClient* CreateMfhHttpClientTest(SOCKET clientSocket,struct sockaddr_in *lpclientAddr)
{
MfhHttpClientTest* client = new MfhHttpClientTest(clientSocket,lpclientAddr);
return client;
}
MfhHttpClientTest类主要工作就是根据用户的请求路径和扩展名创建不同的处理对象,(通过该类可以实现自己的头域解析,可以完全忽略http,具体请参考后续的文章)。主要实现的函数如下:
/**
*创建http对象,该函数可在派生类中实现过滤
*@path请求的路径
*@ext请求路径的扩展名
*@version请求的版本号
*@return成功返回基于CHttpBase类派生的对象
*/
virtual CHttpBase* CreateHttpObj(char* path,char* ext,char* version);
virtual void FreeHttpObj(CHttpBase*);
一个简单的创建函数如下:
CHttpBase* MfhHttpClientTest::CreateHttpObj(char* path,char* ext,char* version)
{
if (ext && strcmp(ext,"mfh") == 0)
{
return (new MyHttp());
}
return MfhHttpClient::CreateHttpObj(path,ext,version);
}
这样在网页上输入http://127.0.0.1:8082/wjh_2010.mfh就会进入MyHttp处理中。
MyHttp中需要处理3个虚函数:
//头域解析完成调用该函数,在函数中需要根据用户提交的参数做特别处理
virtual int OnRequest();
//处理完成之后告诉底层如何组织头域返回给客户端
virtual int OnResponseHeader(char* resopnse,int maxLen);
//最后将自己的数据发送给客户端
virtual int Read(char* data,int maxlen);
例如:
在OnRequest中根据客户端请求准备数据
在OnResponseHeader告诉客户端准备的数据大小,编码格式是什么等信息;
最后在Read将数据填充到data中,返回给客户端。
基于CHttpBase类,当然可以实现私有头域的解析,在OnResponseHeader中增加私有的头域(具体操作方式见后续章节)。
myHttp的实现如下:
/**
*响应客户端
*@return成功返回HTTP_RESPIONE_OK
*失败返回其他代码
*@note
*/
int MyHttp::OnRequest()
{
//这里增加自己的处理逻辑
return HTTP_RESPIONE_OK;
}
const char* g_myTest = "<html><head><title>wjh hello</title></head><body>who am i?</body></html>";
/**
*返回客户端
*@return返回需要写入客户度端的内容长度
*/
int MyHttp::OnResponseHeader(char* resopnse,int maxLen)
{
//处理完成后需要设置基本变量
m_contentLen = strlen(g_myTest);
int len = CHttpBase::OnResponseHeader(resopnse,maxLen);
//继续增加私有的头域
return len;
}
/**
*读取客户端向服务器端返回的数据
*/
int MyHttp::Read(char* data,int maxlen)
{
strncpy(data,g_myTest,maxlen);
return strlen(g_myTest);
}
本次介绍了该架构的基本使用,后续会介绍其session如何引入。
代码完全原创,可以在任何C++编译器上编译。真诚与各位技术大牛门讨论,如有需要请发邮件到[email protected]。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。