SPWebServer:一个基于 SPServer 的 web 服务器框架
看到这个题目,估计很多人会问:为什么要再实现一个 web 服务器?
这里有几个原因:
1.这是一个 web 服务器框架,不是一个完整的 web 服务器。也就是说 SPWebServer 提供的是一套 API 和类库,可以方便地集成到现有的应用程序中。可以称 SPWebServer 为 embedded web server 。
2.有些时候,我们需要的不是一个功能强大完整的 web 服务器(例如 apache ),我们只是需要一个能提供最基本的 http 功能的服务器框架。比如要用 C/C++ 实现 XML-RPC,JSON-RPC 服务器端,或者为 jabberd 实现一个 http bind 的时候。这些场景下,也可以使用 apache,但是使用 embedded web server 可以简化配置。
3.在如下的场合中,apache 显得不合适,而 embedded web server 却正好合适:在一个现有的应用程序中,用 http 接口来提供一些简单的控制和统计功能。
基于以上原因,也为了
1.丰富 SPServer 项目(请参考: SPServer : 一个基于 Half-Sync/Half-Async 模式的高并发 server 框架)的功能;
2.正好作为 SPServer 框架的一个比较好的示范例子;
因此基于 SPServer 框架实现了一个 web 服务器框架。
源代码下载:
http://spserver.googlecode.com/files/spserver-0.5.src.tar.gz
http://code.google.com/p/spserver/downloads/list
下面来看一个使用 SPWebServer 的简单例子。
![ExpandedBlockStart.gif](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockStart.gif](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ExpandedSubBlockStart.gif](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockStart.gif](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockStart.gif](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockStart.gif](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockEnd.gif](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockStart.gif](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockEnd.gif](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockStart.gif](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockEnd.gif](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockEnd.gif](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![ExpandedBlockEnd.gif](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![None.gif](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![ExpandedBlockStart.gif](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockStart.gif](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ExpandedSubBlockStart.gif](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockStart.gif](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockEnd.gif](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![ExpandedBlockEnd.gif](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![None.gif](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![None.gif](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![None.gif](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![None.gif](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![ExpandedBlockStart.gif](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![ExpandedBlockEnd.gif](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![None.gif](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
上面的代码演示的是一个 http echo server ,即把 client 发过来的请求信息显示在页面上。
在最简单的情况下,使用 SPWebServer 需要实现两个类:SP_HttpHandler 的子类 和 SP_HttpHandlerFactory 的子类。
SP_HttpHandler 的子类负责处理具体的 http 请求。
SP_HttpHandlerFactory 的子类协助 spserver 为每一个连接创建一个 SP_HttpHandler 子类实例。
在实现过程中,使用了 Adapter 模式,把 SP_HttpHandler 和 SP_HttpHandlerFactory 适配为 SP_Handler 和 SP_HandlerAdapterFactory。这两个 Adapter 都已经实现,不需要使用者来实现。
还能把浏览器当作 Web 服务器?骚操作,学废了~ 什么?还能把浏览器当作 Web 服务器? 闲话少说,直接干货! 整体思路:PWA 中用于缓存文件的 server workers 可以动态生成新文件,并通过 fetch 事件,将它们发送至浏览器!
相关文章
- web服务器的相关资料 ngix
- Linux网络编程(七)-第三方库-Libevent03:web服务器开发
- 只有0.1%的用户能正确处理Web服务器安全那点儿事
- get起来:现代数据中心服务器维护检查列表
- HTTP 错误 404.2 - Not Found 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面 详细错误:HTTP 错误
- 服务器数据存储 主流磁盘接口详解
- Vue + ElementUI的电商管理系统实例28 项目上线-通过node创建web服务器
- Android中FTP服务器搭建入门
- 一步一步搭建 OAuth 认证服务器
- DELPHI XE5开发WEB服务器及安卓手机客户端
- 如何保障WEB服务器的安全
- ASP.NET自定义Web服务器控件-DropDownList/Select下拉列表控件
- 阿里云服务器ECS感染木马病毒后怎么办
- 2023年阿里云活动有哪些实例规格的云服务器?如何选择这些实例规格
- Abyss Web服务器,高效防墙系统
- ECS云服务器通过SAP HANA认证,海量数据处理技术助力企业数字化转型
- Linux VPS Web服务器网络连接问题处理方法
- python下的web服务器模块
- Linux平台下快速搭建FTP服务器
- 从零开始建立一个Dart服务器
- Linux服务器时间相关命令记录
- CentOS 8 安装 Caddy Web服务器
- Web服务精讲–搭个 Web 服务器(二)
- Web安全 文件上传漏洞的 测试和利用.(上传一个图片或文件 拿下服务器最高权限.)
- python学习之Web静态服务器