好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

web服务器的简单实现

web服务器的简单实现

 

web服务器的简单实现——HTTP权威指南读书心得(七)

我又回来做笔记了~最近懒死了,书虽然看完了,但是一直懒得动笔,这样不行啊(¯﹃¯)口水。还有在这里吐槽下,在围观这本书的时候,一直有一种奇怪的感觉:里面说的有些东西与时代脱节啊......越读越感觉不对劲,最后终于在一个月黑风高的夜晚,我发现了一个惊人的秘密,那就是....这本书的英文版是在2002年出版的啊....怪不得...所以说里面的有些东西应该说已经过时。这个故事告诉我们一个深刻的道理:一定要好好学英语!

    废话不多说,来看看今天的主要内容:

                                                              WEB服务器

     web服务器是我们每天浏览的这些网页的基础,它接收用户的请求,处理,最后向客户发回响应,常见的web服务器有IIS,apache,Nginx等等,这里说明下 apache与tomcat的区别 : Apache是web服务器,Tomcat是应用(java)服务器,它只是一个servlet容器,是Apache的扩展。 Apache和Tomcat都可以做为独立的web服务器来运行,但是Apache不能解释java程序(jsp,serverlet)。两者都是一种容器,只不过发布的东西不同:Apache是html容器,功能像IIS一样;Tomcat是jsp/servlet容器,用于发布jsp及java的,类似的有IBM的websphere、BEA的Weblogic,sun的JRun等等。

     web服务器进行服务时候的主要步骤 :

建立连接——接收一个客户端连接 接受请求——从网络中读取一条HTTP请求报文 处理请求——对请求报文进行解析,并进行下一步工作 访问资源——访问请求报文中指定的资源 构建响应——创建正确的响应报文 发送响应——将响应发回客户端 记录事务过程——将与完成事务有关的信息记录在日志中。

     当客户端与服务器建立连接成功以后,客户端会向服务器发出其请求报文,这个请求报文中包含着以特定格式记录的请求信息,如请求行,请求首部,以及请求实体。当服务器接收完请求报文之后,按照约定格式对请求进行解析,了解客户端需要的东西。服务器有很多种类:单线程,多线程多进程,复用结构,服用多线程结构。多线程多进程服务器为每一个连接都提供了一个线程或者进程,对其进行监控处理。复用结构服务器会监视所有的连接,但是只有连接状态发生变化时才会对连接进行处理,连接空闲或者等待的时候并不会绑定线程或者进程。复用多线程服务器将他们两个的特点结合到一起,更高效的利用资源。

    通常客户端会请求一些资源,如图片等,当服务器解析完客户端的请求之后,便会寻找客户端请求的资源,寻找资源的方法有很多种,可以使用docroot对路径补全,以寻找目标文件在服务器上的真实路径并访问,当然也有一台服务器上有很多站点的情况,这时便可以使用虚拟主机对docroot进行配置,也可以使用CGI访问动态的服务器资源。

    获得想要访问的资源或者被拒绝之后,根据结果构建响应报文,最后将构建好的响应报文回送给客户端。

    下面是一个用JAVA实现的简单web服务器demo:

   

  1   import   java.io.DataInputStream;
   2   import   java.io.PrintStream;
   3   import   java.net.ServerSocket;
   4   import   java.net.Socket;
   5   public   class   WebServer {
   6  
  7       /** 
  8        *   @param   args
   9        */ 
 10       public   static   void   main(String[] args) {
  11           //   TODO Auto-generated method stub
  12           //  i对线程标记,port为监听的机器端口号 
 13           int  i=1,port=80 ;
  14          ServerSocket serverSocket= null  ;
  15          Socket socket= null  ;
  16           try   {
  17               //  新建一个服务器监听对象 
 18              serverSocket= new   ServerSocket(port);
  19              System.out.println("listening!!" );
  20               //  连续监听客户端请求 
 21               while  ( true  ) {
  22                  socket=serverSocket.accept(); //  这里会等待客户端的请求 
 23                   new  ConnectionThread(socket, i).start(); //  一旦接受到客户端请求,便开启请求事务处理线程对请求进行异步处理 
 24                  i++ ;
  25               }
  26          }  catch   (Exception e) {
  27               //   TODO: handle exception 
 28           }
  29       }
  30   }
  31   //  事务处理线程 
 32   class  ConnectionThread  extends   Thread{
  33      Socket socket= null  ;
  34       int   count;
  35       public  ConnectionThread(Socket s, int   i) {
  36           //   TODO Auto-generated constructor stub 
 37          socket= s;
  38          count= i;
  39       }
  40       public   void   run() {
  41           try   {
  42              String ip=socket.getInetAddress().toString(); //  获取ip 
 43               int  destport=socket.getPort(); //  获取端口 
 44              System.out.println("Client:"+ip+":"+ destport);
  45              PrintStream outStream= new  PrintStream(socket.getOutputStream()); //  获取输出流 
 46              DataInputStream inStream= new  DataInputStream(socket.getInputStream()); //  获取输入流 
 47              StringBuilder inString= new   StringBuilder();
  48               String temp;
  49               //  打印接收到的请求 
 50               while  (!(temp=inStream.readLine()).equals("" )) {
  51                  inString.append(temp+"\n" );                
  52               }
  53              System.out.println("Request:\n"+ inString.toString());
  54               //  向客户端返回特定的响应首部 
 55              outStream.println("HTTP/1.0 200 OK" );
  56              outStream.println("Content-Type:text/html" );
  57              outStream.println("Content-Length:"+"This is a test!!" .length());
  58              outStream.println("" );
  59              outStream.println("This is a test!!" );
  60               outStream.flush();
  61          }  catch   (Exception e) {
  62               //   TODO: handle exception 
 63           }
  64       }
  65  }

访问localhost的请求报文:

demo的响应报文:

页面效果就是显示一句话:

可以看到,响应报文的传输方法就是按一定格式通过流进行传送。

这章没什么好说的,就到这里咯~

 

 

 

 

 

分类:  基础知识

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于web服务器的简单实现的详细内容...

  阅读:32次