SPWebServer:一个基于 SPServer 的 web 服务器框架

SPWebServer:一个基于 SPServer 的 web 服务器框架

博客分类:

应用服务器框架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 的简单例子。

Java代码  

  1. class SP_HttpEchoHandler : public SP_HttpHandler {
  2. public:
  3. SP_HttpEchoHandler(){}
  4. virtual ~SP_HttpEchoHandler(){}
  5. virtual void handle( SP_HttpRequest * request, SP_HttpResponse * response ) {
  6. response->setStatusCode( 200 );
  7. response->appendContent( "<html><head>"
  8. "<title>Welcome to simple http</title>"
  9. "</head><body>" );
  10. char buffer[ 512 ] = { 0 };
  11. snprintf( buffer, sizeof( buffer ),
  12. "<p>The requested URI is : %s.</p>", request->getURI() );
  13. response->appendContent( buffer );
  14. snprintf( buffer, sizeof( buffer ),
  15. "<p>Client IP is : %s.</p>", request->getClientIP() );
  16. response->appendContent( buffer );
  17. for( int i = 0; i < request->getParamCount(); i++ ) {
  18. snprintf( buffer, sizeof( buffer ),
  19. "<p>Param - %s = %s<p>", request->getParamName( i ),
  20. request->getParamValue( i ) );
  21. response->appendContent( buffer );
  22. }
  23. for( int i = 0; i < request->getHeaderCount(); i++ ) {
  24. snprintf( buffer, sizeof( buffer ),
  25. "<p>Header - %s: %s<p>", request->getHeaderName( i ),
  26. request->getHeaderValue( i ) );
  27. response->appendContent( buffer );
  28. }
  29. if( NULL != request->getContent() ) {
  30. response->appendContent( "<p>" );
  31. response->appendContent( request->getContent(),
  32. request->getContentLength() );
  33. response->appendContent( "</p>" );
  34. }
  35. response->appendContent( "</body></html>\n" );
  36. }
  37. };
  38. class SP_HttpEchoHandlerFactory : public SP_HttpHandlerFactory {
  39. public:
  40. SP_HttpEchoHandlerFactory(){}
  41. virtual ~SP_HttpEchoHandlerFactory(){}
  42. virtual SP_HttpHandler * create() const {
  43. return new SP_HttpEchoHandler();
  44. }
  45. };
  46. //---------------------------------------------------------
  47. int main( int argc, char * argv[] )
  48. {
  49. int port = 8080;
  50. SP_Server server( "", port,
  51. new SP_HttpHandlerAdapterFactory( new SP_HttpEchoHandlerFactory() ) );
  52. server.runForever();
  53. return 0;
  54. }

上面的代码演示的是一个 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 都已经实现,不需要使用者来实现。

SPWebServer:一个基于 SPServer 的 web 服务器框架,布布扣,bubuko.com

时间: 2024-10-05 11:10:37

SPWebServer:一个基于 SPServer 的 web 服务器框架的相关文章

linux学习笔记——搭建基于nginx的web服务器、多核配置、nginx配置参数

############ 认识nginx #############Nginx:(发音同 engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler(俄文:Рамблер)使用.  其优点是轻量级(占有内存少),高并发(并发能力强),事实上nginx的并发能力确实在同类型的网页伺服器中表现较好.目前中国大陆使用ngi

一个简单的Java web服务器实现

一个简单的Java web服务器实现,比较简单,基于java.net.Socket和java.net.ServerSocket实现: 程序执行步骤 创建一个ServerSocket对象: 调用ServerSocket对象的accept方法,等待连接,连接成功会返回一个Socket对象,否则一直阻塞等待: 从Socket对象中获取InputStream和OutputStream字节流,这两个流分别对应request请求和response响应: 处理请求:读取InputStream字节流信息,转成字

基于TcpListerer的web服务器 和 基于HttpListerer的web服务器

摘自<Asp.Net 本质论>作者:郝冠军 /*为了简化基于TCP协议的监听程序,.NET在System.Net.Sockets命名空间中提供了TcpListerer类,使用它,在构造函数中传递一组网络端点信息就可以准备好监听参数,而不再需要设置使用的网络协议等细节,调用Start方法之后,监听工作开始.AcceptTcpClient方法将阻塞进程,知道一个客户端的连接到达监听器,这个方法将返回一个代表客户端连接的代理对象*/ 1 class TcpListener_Study 2 { 3 p

Java 并发专题 : Executor详细介绍 打造基于Executor的Web服务器

适配器模式,将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 应用场景:系统的数据和行为都正确,但接口不符时,我们应该考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配.适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况. 代码实现: //Adapter.h #include "stdafx.h" #include <iostream> class Adaptee

基于HttpListener的web服务器

写在前面 前面两篇文章分别介绍了基于原始socket的web服务器和基于tcpListener的web服务器,本篇文章将继续介绍另外一种基于HttpListener的. HttpListener HttpListener进一步的简化了Http协议的监听,仅需通过字符串的方法提供监听的地址和端口号以及虚拟路径,就可以开始监听工作了. using System; using System.Collections.Generic; using System.Linq; using System.Net

构建基于Nginx的web服务器

构建基于Nginx的web服务器 一.简介 Nginx("engine x") 是一个高性能的HTTP 和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器. Nginx 是由Igor Sysoev为俄罗斯访问量第二的Rambler.ru站 点开发的,它已经在该站点运行超过四年多了.Igor 将源代码以类BSD许可证的形式发布.自Nginx 发布四年来,Nginx 已经因为它的占有内存少.并发能力强.稳定性.丰富的功能集.示例配置文件和低系统资源的消耗而闻名了.目前国内各大

LVS详解及基于LVS实现web服务器负载均衡

前言 LVS(Linux Virtual Server)Linux虚拟服务器,是一个虚拟的服务器集群系统.本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一.通过LVS提供的负载均衡技术和Linux操作系统可实现一个高性能.高可用的服务器群集,从而以低成本实现最优的服务性能. 集群基础 集群简介 集群(Cluster)是一组相互独立的.通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理.一个客户与集群相互作用时,集群像是一个独立的服务器.集群配置是用

LAMP平台基于NFS实现web服务器负载均衡

前言 随着访问量的逐渐增大,一台web服务器可能已经无法满足需求,这就需要增加web服务器的数量了,于是问题就来了:如何保证两台服务器数据同步呢?本文将讲解如何基于NFS实现web服务器的负载均衡及数据同步. NFS服务介绍 NFS(Network File System)网络文件系统,允许一个系统通过网络共享目录和文件,通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件.NFS本身没有提供数据传输的功能,必须借助于远程过程调用(RPC)协议来实现数据的传输. 配置文件 NFS

Netty:一个非阻塞的客户端/服务器框架

Netty:一个非阻塞的客户端/服务器框架 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs Netty是一个异步事件驱动的网络应用框架,为Java网络应用的开发带来了一些新活力.Netty由协议服务器和客户端所组成,可用于快速开发可维护的高性能软件.Netty应用框架及其工具简化了网络编程,而且由Netty社区进行维护. Netty还被归类为NIO客户端/服务器框架,用它能够快速.简易地开发网络应用,使得TCP和UDP套接字服务器的网络编程得以简化和