MyException - 我的异常网
当前位置:我的异常网» Web前端 » 运用 acl_cpp 的 HttpServlet 类及服务器框架编写WE

运用 acl_cpp 的 HttpServlet 类及服务器框架编写WEB服务器程序

www.MyException.Cn  网友分享于:2015-08-26  浏览:2次
使用 acl_cpp 的 HttpServlet 类及服务器框架编写WEB服务器程序

      在 《用C++实现类似于JAVA HttpServlet 的编程接口 》 文章中讲了如何用 HttpServlet 等相关类编写 CGI 程序,于是有网友提出了 CGI 程序低效性,不错,确实 CGI 程序的进程开销是比较大的,本文就将说明依然是这些 HTTP 相关的类,如果在使用 acl_cpp/src/master 下的服务器框架类的条件下,可以非常方便地转为服务器程序。现在依然是使用 《用C++实现类似于JAVA HttpServlet 的编程接口 》示例中的 http_servlet 类,只是稍微修改一下 main 函数,就变成下面的情形:

 

 

//////////////////////////////////////////////////////////////////////////

class master_service : public acl::master_proc
{
public:
	master_service() {}
	~master_service() {}
protected:
	// 基类虚函数,当接收到一个 HTTP 客户端请求时,服务器
	// 框架回调此函数将连接流传入
	virtual void on_accept(acl::socket_stream* stream)
	{
		// HttpServlet 的子类实例
		http_servlet servlet("127.0.0.1:11211");
		servlet.setLocalCharset("gb2312");  // 设置本地字符集
		servlet.doRun(stream);  // 开始处理浏览器请求过程
	}
};

//////////////////////////////////////////////////////////////////////////

int main(int argc, char* argv[])
{
	acl::acl_cpp_init();  // 初始化 acl_cpp 库
	master_service service;  // 半驻留进程池服务类对象

	// 开始运行

	if (argc >= 2 && strcmp(argv[1], "alone") == 0)
	{
		// 当在手工调试时一般采用此方式
		printf("listen: 127.0.0.1:8888 ...\r\n");
		service.run_alone("127.0.0.1:8888", NULL, 1);  // 单独运行方式
	}
	else  // 生产环境中以半驻留进程池模式运行
		service.run_daemon(argc, argv);  // acl_master 控制模式运行

	return 0;
}

 

      上面的例子是一个结合 HttpServlet 类及 master_service 进程池服务类的 HTTP 服务器程序,关于进程池的例子,可以先结合本人原来写过的基于C语言库 acl 的一篇文章《快速创建你的服务器程序--single进程池模型 》。

 

      不仅可以非常容易地将 HttpServlet 写成进程池方式,同时还可以结合 acl_cpp 的线程池框架模板,将 HttpServlet 类实现为半驻留线程池实例,下面就显示了这一过程:

 

class master_threads_test : public acl::master_threads
{
public:
	master_threads_test() {}

	~master_threads_test() {}

protected:
	// 基类纯虚函数:当客户端连接有数据可读或关闭时回调此函数,返回 true 表示
	// 继续与客户端保持长连接,否则表示需要关闭客户端连接
	virtual bool thread_on_read(acl::socket_stream* stream)
	{
		// HttpServlet 的子类实例
		http_servlet servlet;
		servlet.setLocalCharset("gb2312");  // 设置本地字符集
		servlet.doRun(“127.0.0.1:11211”, stream);  // 开始处理浏览器请求过程,同时设置 memcached 的监听地址及客户端连接流
	}

	// 基类虚函数:当接收到一个客户端请求时,调用此函数,允许
	// 子类事先对客户端连接进行处理,返回 true 表示继续,否则
	// 要求关闭该客户端连接
	virtual bool thread_on_accept(acl::socket_stream*)
	{
		return true;  // 返回 true 以允许服务器框架继续调用 thread_on_read 过程
	}
};

// 字符串类配置参数项

static char *var_cfg_debug_msg;

static acl::master_str_tbl var_conf_str_tab[] = {
	{ "debug_msg", "test_msg", &var_cfg_debug_msg },

	{ 0, 0, 0 }
};

// 布尔配置参数项
static int  var_cfg_debug_enable;
static int  var_cfg_keep_alive;
static int  var_cfg_loop;

static acl::master_bool_tbl var_conf_bool_tab[] = {
	{ "debug_enable", 1, &var_cfg_debug_enable },
	{ "keep_alive", 1, &var_cfg_keep_alive },
	{ "loop_read", 1, &var_cfg_loop },

	{ 0, 0, 0 }
};

// 整数配置参数项
static int  var_cfg_io_timeout;

static acl::master_int_tbl var_conf_int_tab[] = {
	{ "io_timeout", 120, &var_cfg_io_timeout, 0, 0 },

	{ 0, 0 , 0 , 0, 0 }
};

int main(int argc, char* argv[])
{
	master_threads_test mt;  // 半驻留线程池服务器实例

	// 设置配置参数表
	mt.set_cfg_int(var_conf_int_tab);
	mt.set_cfg_int64(NULL);
	mt.set_cfg_str(var_conf_str_tab);
	mt.set_cfg_bool(var_conf_bool_tab);

	// 开始运行

	if (argc >= 2 && strcmp(argv[1], "alone") == 0)
	{
		// 当在手工调试时一般采用此方式
		printf("listen: 127.0.0.1:8888\r\n");
		mt.run_alone("127.0.0.1:8888", NULL, 2, 10);  // 单独运行方式
	}
	else  // 生产环境中以半驻留线程池模式运行
		mt.run_daemon(argc, argv);  // acl_master 控制模式运行
	return 0;
}
 

      该例子显示了一个基于线程池服务器模型的WEB实例,可以依然使用了文章 《用C++实现类似于JAVA HttpServlet 的编程接口 》示例中的 http_servlet 类,但采用的是由文章 《 开发多线程进程池服务器程序---acl 服务器框架应用 》所介绍的多进程多线程服务器框架模板。

 

     参考:

     使用 acl::master_proc 类编写多进程服务器程序

     使用 acl::master_threads 类编写多进程多线程服务器程序

       acl_cpp 下载

       原文地址

       更多文章

文章评论

团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
编程语言是女人
编程语言是女人
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
程序员应该关注的一些事儿
程序员应该关注的一些事儿
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
程序员和编码员之间的区别
程序员和编码员之间的区别
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
程序员必看的十大电影
程序员必看的十大电影
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
 程序员的样子
程序员的样子
我是如何打败拖延症的
我是如何打败拖延症的
那些争议最大的编程观点
那些争议最大的编程观点
总结2014中国互联网十大段子
总结2014中国互联网十大段子
程序员都该阅读的书
程序员都该阅读的书
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
中美印日四国程序员比较
中美印日四国程序员比较
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
程序员的鄙视链
程序员的鄙视链
代码女神横空出世
代码女神横空出世
老程序员的下场
老程序员的下场
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
鲜为人知的编程真相
鲜为人知的编程真相
10个调试和排错的小建议
10个调试和排错的小建议
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
一个程序员的时间管理
一个程序员的时间管理
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
Java程序员必看电影
Java程序员必看电影
为什么程序员都是夜猫子
为什么程序员都是夜猫子
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有