博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用 acl_cpp 的 HttpServlet 类及服务器框架编写WEB服务器程序
阅读量:6682 次
发布时间:2019-06-25

本文共 3028 字,大约阅读时间需要 10 分钟。

hot3.png

 

      在 《 》 文章中讲了如何用 HttpServlet 等相关类编写 CGI 程序,于是有网友提出了 CGI 程序低效性,不错,确实 CGI 程序的进程开销是比较大的,本文就将说明依然是这些 HTTP 相关的类,如果在使用 acl_cpp/src/master 下的服务器框架类的条件下,可以非常方便地转为服务器程序。现在依然是使用 《 》示例中的 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语言库 的一篇文章《 》。

 

      不仅可以非常容易地将 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实例,可以依然使用了文章 《 》示例中的 http_servlet 类,但采用的是由文章 《 》所介绍的多进程多线程服务器框架模板。

 

     个人微博:

     参考:

     

     

       

       

       

       QQ 群:242722074

转载于:https://my.oschina.net/u/568966/blog/309524

你可能感兴趣的文章
NOR flash and NAND flash
查看>>
关于异步委托的调用与应用场景
查看>>
flask+redis实现抢购(秒杀)功能
查看>>
Linux 学习笔记 (一)在VMware 中安装 Ubtuntu 以及 VMware tools
查看>>
经典测试用例
查看>>
3月16日学习内容整理:metaclass
查看>>
Vue和其他框架的区别
查看>>
【iPhone5概念机最新效果图曝光】
查看>>
深入浅出:5G和HTTP
查看>>
ES6-let和const命令
查看>>
java反射,代码优化
查看>>
python中获取当前所有的logger
查看>>
关于BDD100k数据输入处理mask变为56*56
查看>>
Reveal使用心法
查看>>
Directx11教程(18) D3D11管线(7)
查看>>
JVM系列二:GC策略&内存申请、对象衰老
查看>>
正则的[]与()
查看>>
OCP换题库了,052新加的考题及答案整理-第16题
查看>>
OCP新题,2019题库出现大量新题,062-第22题
查看>>
MySQL查询in操作 查询结果按in集合顺序显示(转)
查看>>