使用 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 类编写多进程多线程服务器程序
QQ 群:242722074
https://my.oschina.net/u/568966/blog/309524
使用 acl_cpp 的 HttpServlet 类及服务器框架编写WEB服务器程序(系列文章)的更多相关文章
- 一文读懂Python web框架和web服务器之间的关系
我们都知道 Python 作为一门强大的语言,能够适应快速原型和较大项目的制作,因此被广泛用于 web 应用程序的开发中. 在面试的过程中,大家或多或少都被问到过这样一个问题:一个请求从浏览器发出到数 ...
- JAVA编写WEB服务器
一.超文本传输协议 1.1 HTTP请求 1.2 HTTP应答 二.Socket类 三.ServerSocket类 四.Web服务器实例 4.1 HttpServer类 4.2 Requ ...
- 实战WEB 服务器(JAVA编写WEB服务器)
实战WEB 服务器(JAVA编写WEB服务器) 标签: web服务服务器javawebsockethttp服务器 2010-04-21 17:09 11631人阅读 评论(24) 收藏 举报 分类: ...
- Tomcat Web服务器与常用Web服务器
一.常用Web服务器 Tomcat 由Apache组织提供的一种Web服务器,提供对jsp和servlet的支持.它是一种轻量级的javaWeb容器服务器.也是当前应用最广的JavaWeb服务器( ...
- SSM框架搭建web服务器实现登录功能(Spring+SpringMVC+Mybatis)
初学java EE,虽然知道使用框架会使开发更加便捷高效,但是对于初学者来说,感到使用框架比较迷惑,尤其是各种jar包的引用.各种框架的配置.注解的使用等等. 最好的学习方法就是实践,于是下载了一个现 ...
- 简单的使用Nginx框架搭建Web服务器~
系统环境Debian 8,内核版本 一.首先来安装nginx服务程序: 1.安装nginx服务需要的相关程序(记得在root权限下操作下面的指令) aptitude install libpcre3 ...
- Linux 服务器作为Nginx web服务器常见优化参数
内核参数调整cat /etc/sysctl.conf# sysctl settings are defined through files in # /usr/lib/sysctl.d/, /run/ ...
- ASP.Net 类(CS)文件怎样获取Web应用程序的路径
Web应用程序,写了一个线程CS类别,这个类别将会放于Global.asax文件中执行,主要是监控程序下某一个文件是否有异动,而作出相应警示动作,如发送邮件等. 实现运行过程中,也许会有一个情况出现, ...
- web端自动化——unittest框架编写web测试用例
1.前言: 对于初学者来说,python自带的IDLE,精简又方便,不过一个好的编辑器能让python编码变得更方便,更加优美些. 不过呢,也可以自己去下载其他更好用的代码编辑器,在这推荐: PyCh ...
随机推荐
- tap code —— 两个一位数字编码一个字母
5 * 5 的矩阵(表格)编码 26 个字母 单词中如果出现 K,就用 C 代替,所以其实也可视为表中无 K 这个字母(据说拉丁文中 K 都是用 C 来代替的): 在<疑犯追踪>(POI, ...
- win10 uwp 使用 msbuild 命令行编译 UWP 程序
原文:win10 uwp 使用 msbuild 命令行编译 UWP 程序 版权声明:博客已迁移到 http://lindexi.gitee.io 欢迎访问.如果当前博客图片看不到,请到 http:// ...
- EditText 详细信息(监听事件时,输入改变、透明背景、提示改变文字颜色、密文输入)
1.对EditText输入监视.给EditText 捆绑 addTextChangedListener 监控事件 能够. 2.EditText输入内容.密文显示: android:password=& ...
- matlab 排列组合
0. gamma 函数与阶乘 gamma(n+1) == n! == prod(1:n); gammaln():gamma 函数的返回值,gammaln(A) = log(gamma(A)), 之所以 ...
- Leetcode 318 Maximum Product of Word Lengths 字符串处理+位运算
先介绍下本题的题意: 在一个字符串组成的数组words中,找出max{Length(words[i]) * Length(words[j]) },其中words[i]和words[j]中没有相同的字母 ...
- python 教程 第八章、 第一个python程序
第八章. 第一个python程序 #!/usr/bin/env python import os import sys import time source = [r'G:\s1', r'G:\s2' ...
- Notepad++ 自定义关键字
Notepad++是一款輕便好用的編輯器,但可能有些語言的關鍵字不全,比方SQL中,默認關鍵字沒有Merge. 怎样給Notepad++中的語言添加關鍵字,而不是大動干戈自定義一個語言? 步驟: Se ...
- ./configure,make,make install的作用(configure一般用来生成 Makefile,相当于qmake)
这些都是典型的使用GNU的AUTOCONF和AUTOMAKE产生的程序的安装步骤. ./configure是用来检测你的安装平台的目标特征的.比如它会检测你是不是有CC或GCC,并不是需要CC或GCC ...
- SAAS是否能实现人在家工作的梦想?
在过去的十年,在人们的工作环境的巨大变化已经发生,越来越多的人选择在家工作. 高租金的办公室,络,快速宽带的广泛应用.这些因素都使得远程办公成为了人们工作中密不可分的一种方式.使用普通手机和办公操作系 ...
- [Gevent]gevent 网络抓取问答
我听说过gevent基于事件的异步处理功能 如何高效率,该项目已很少使用,今天是没什么学习一些简单的使用. 有正式书面一个非常好的教程 中国版的地址:http://xlambda.com/gevent ...