`
zsxxsz
  • 浏览: 452059 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用 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 服务器框架应用 》所介绍的多进程多线程服务器框架模板。

 

     个人微博:http://weibo.com/zsxxsz

     参考:

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

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

       acl 下载

       github: https://github.com/acl-dev/acl

       原文地址

       更多文章

       QQ 群:242722074

       微博:http://weibo.com/zsxxsz/

2
0
分享到:
评论

相关推荐

    acl_cpp:用于win32 / linux,服务器框架,HttpServlet的功能强大的c ++库-开源

    https://sourceforge.net/projects/acl/,请从acl项目url下载)是acl的c ++包装库,并且acl_cpp比acl具有更多有用的功能,例如例如流式mime解析,处理程序套接字支持以及db(mysql和sqlite)池接口,HttpServlet等。...

    acl_cpp:一个强大的 c++ 库,用于 win32/linux、服务器框架、HttpServlet-开源

    https://sourceforge.net/projects/acl/,请从acl项目url下载)是acl的c++封装库,acl_cpp比acl有很多有用的功能,比如如流式mime解析、handler socket支持、db(mysql和sqlite)池接口、HttpServlet等。有了acl_cpp,...

    使用_Eclipse_+_Tomcat_编写_S

    在开发Java Web应用程序时,Eclipse IDE和Apache Tomcat服务器是常见的组合,它们共同帮助开发者构建、测试和部署Servlets。以下将详细解释如何使用Eclipse和Tomcat编写Servlet。 首先,我们需要创建一个Web项目: ...

    Tomcat下HttpServlet的Web应用工程

    【标题】"Tomcat下HttpServlet的Web应用工程"是一个基于Java J2EE技术的Web项目,它在Tomcat7服务器环境下运行。这个项目利用了Eclipse 4.4作为集成开发环境(IDE),展示了如何在Linux操作系统中构建和部署Web应用...

    java web 服务器 源码

    1. **Java Servlet API**: 这是Java Web开发的核心组件,定义了服务器端Java应用程序(Servlet)与Web服务器之间的接口。Servlet API包括Servlet和Filter两个主要接口,它们允许开发者扩展服务器的功能,处理HTTP...

    Java Web程序设计入门课件-HttpServlet.pptx

    Java Web程序设计是一种用于构建基于Web的应用程序的技术,它结合了Java编程语言的强大功能与Web服务器的功能,使得开发者能够创建动态、交互式的网页。在这个入门课程中,我们将深入理解HttpServlet,它是Java Web...

    acl 框架库-其他

    5、服务器框架:包括进程池模式、线程池模式、非阻塞模式、UDP通信模式及触发器模式 6、事件引擎:支持 select、poll(for unix)、epoll(for linux)、kqueue(for bsd)、devpoll(for solaris)、iocp(for win32)、win32...

    一个支持servlet的web服务器.rar

    它们是Java EE(Enterprise Edition)的一部分,主要用于构建服务器端的应用程序,特别是Web应用程序。Servlet的主要任务包括接收来自客户端的HTTP请求,处理这些请求,然后生成相应的HTTP响应返回给客户端。 要...

    httpservlet.jar包下载

    当开发Java Web应用时,通常会将`httpservlet.jar`、`javax.servlet.jsp.jar`和其他必要的库一起打包到应用的Web-INF/lib目录下,这样在部署到支持Servlet和JSP的Web服务器(如Tomcat、Jetty等)时,服务器可以找到...

    Java服务器程序设计

    用java进行客户端的applet (小程序)开发的技术已广为使用,而用java进行服务器端的servlet(服务器小程序)开发则尚需揭开其神秘的面纱,本书正是基于这样的目的编写的。全书从java服务器的体系结构、开发工具和...

    HttpServer.zip_http servlet server_httpclient_http服务器_java https

    在Java中,我们通常使用Servlet容器(如Tomcat)来运行Servlet程序。然而,这个项目提供了一个自定义的HTTP服务器实现,它可以直接运行Servlet,无需依赖外部容器。这使得服务器的部署和管理更为灵活。 1. ...

    HttpServlet 的Servlet的详解

    本文档旨在帮助开发者深入了解`HttpServlet`的工作原理以及如何有效地使用它来开发高性能的Web应用程序。 #### 2. 谁需要阅读这份文档 - **Servlet开发者**:如果你正在使用Servlet技术来构建Web应用程序,那么这...

    JavaWeb程序设计入门课件HttpServlet共4页

    JavaWeb是Java技术在Web开发中的应用,它提供了构建动态网站和应用程序的框架。本课件主要聚焦于HttpServlet,它是Java Servlet API的一部分,用于处理HTTP协议的请求和响应。HttpServlet是所有Servlet的基础类,...

    java+web+ssh框架

    1. **Web程序运行基本原理**:Web程序运行的基本原理涉及客户端与服务器之间的交互过程。通常情况下,客户端通过HTTP协议向服务器发送请求,服务器接收请求后,根据请求中的指令进行相应的处理并返回结果给客户端。 ...

    java写的web服务器

    Java编写的Web服务器是一种基于Java技术构建的网络服务器,它能够处理HTTP协议,为用户提供Web应用服务。在Java中实现Web服务器,通常会利用Servlet API和JavaServer Pages(JSP)技术,这些是Java EE(企业版)的一...

    httpservlet的jar包,修复httpservlet报错

    Servlet是Java EE(现在称为Jakarta EE)规范的一部分,它定义了一组接口和类,允许开发者编写能与Web服务器交互的应用程序。Servlet容器(如Tomcat、Jetty等)负责加载和管理Servlet实例,处理来自客户端的请求,并...

    HttpServlet实现的资料,帮助初学者使用HttpServlet

    - Servlet是Java语言实现的一个接口,全称为Java Servlet,它是一个服务器端程序,主要用于生成动态Web内容,处理客户端的请求并返回响应。Servlet可以在任何支持Java的应用服务器上运行,最常见的是扩展基于HTTP...

    客户端与服务器的对话程序,有UI界面

    在IT行业中,客户端-服务器(Client-Server)架构是一种常见的通信模式,广泛应用于网络应用程序,如Web服务、数据库连接和文件共享等。本项目提供的"客户端与服务器的对话程序,有UI界面"就是一个典型示例,它允许...

    Android教程之用_HTML_5_构建_Web_应用程序(二)

    为了解决这个问题,我们需要创建一个代理服务器,以便让Web应用通过这个服务器间接访问外部API。 下面是一个使用Java编写的简单代理servlet示例: ```java public class FutureWebServlet extends HttpServlet { ...

    查看httpServlet源码的包必须导入这个包才能看源代码

    在Java Web开发中,`HttpServlet` 是一个关键的组件,它是Servlet API的一部分,由Apache Tomcat这样的Web服务器实现。`HttpServlet` 提供了处理HTTP请求的基础框架,开发者可以通过继承`HttpServlet`并覆盖其特定...

Global site tag (gtag.js) - Google Analytics