在 《用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 类编写多进程多线程服务器程序
github: https://github.com/acl-dev/acl
QQ 群:242722074
微博:http://weibo.com/zsxxsz/
相关推荐
https://sourceforge.net/projects/acl/,请从acl项目url下载)是acl的c ++包装库,并且acl_cpp比acl具有更多有用的功能,例如例如流式mime解析,处理程序套接字支持以及db(mysql和sqlite)池接口,HttpServlet等。...
https://sourceforge.net/projects/acl/,请从acl项目url下载)是acl的c++封装库,acl_cpp比acl有很多有用的功能,比如如流式mime解析、handler socket支持、db(mysql和sqlite)池接口、HttpServlet等。有了acl_cpp,...
用java进行客户端的applet (小程序)开发的技术已广为使用,而用java进行服务器端的servlet(服务器小程序)开发则尚需揭开其神秘的面纱,本书正是基于这样的目的编写的。全书从java服务器的体系结构、开发工具和...
5、服务器框架:包括进程池模式、线程池模式、非阻塞模式、UDP通信模式及触发器模式 6、事件引擎:支持 select、poll(for unix)、epoll(for linux)、kqueue(for bsd)、devpoll(for solaris)、iocp(for win32)、win32...
用java写的标准web服务器源码实现了大部分 HttpServlet 协议,具有参考价值
<<Java Web程序设计教程.pdf>>人民邮电出版社的教程哦,所以,好书,你懂的!! 第1章web应用开发简介 1 1.1何为web应用 1 1.1.1web的概念及发展 1 1.1.2web应用程序 2 1.2使用java开发web应用 3 1.2.1面向对象...
Servlet(Server Applet),全称Java Servlet,Java服务器应用程序。是用Java编写的服务器端程 序。 其主要功能在于交互式地浏览和修改数据,生成动态Web内容。 狭义的Servlet是指Java语言实现的一个接口, 广义的...
1、掌握 HttpServlet 的概念,相关 API 以及开发步骤; 2、掌握 JSP 技术的基本语法; 3、掌握 JSP 各隐含变量的使用方法; 4、掌握使用 Servlet 和 JSP 集成开发简单用户登录功能。
Java Web程序设计入门
通过JAVA反射技术对HttpServlet进行简单封装,类似于struts框架,页面请求过来的参数名只需要与Action<T> T这个Bean里的变量对应即可,getForm()就是获得页面传过来的参数[注:当前这个只能传T里的string和int/...
HttpServlet 的Servlet的详解
HttpServlet完全自学手册,由浅入深.
本工程取自Linux系统下,使用eclipse 4.4构建的Tomcat7,web工程,能够后台显示log4j日志,具有文件下载、上传功能的Servlet,周末在家练习下J2EE的使用,适合学习用。
HttpServlet 代码
httpservlet.jar包下载
Servlet建模:Servlet是用Java语言编写在服务器上运行的程序。它接受来自客户端的请求,并把处理结果返回客户端。编写Servlet类通常继承GenericServlet或HttpServlet类。因此Java中有两种类型的 Servlet在Rose中分别...
知道如何解决web开发中的中文乱码问题,知道乱码问题产生的原因和解决方法 会debug服务端代码 什么是Servlet Servlet是Java web应用中最核心的组件,完全用Java语言编写,它运行于服务端,它的程序代码被服务器动态...
要在Web应用程序中使用Servlet,您需要将其部署到Web服务器上。 Web服务器通常支持Java Servlet规范,并提供一个Servlet容器,例如Tomcat或Jetty。您可以将编译后的Servlet类文件(.class文件)部署到Servlet容器中...
全网唯一的基于java 写的完整的httpservlet 实现,可通过xml 灵活配置
httpservlet的jar包,修复httpservlet报错