zoukankan      html  css  js  c++  java
  • web服务器原理

    一.WebServer.java文件:

     1 package webserver;
     2 
     3 import java.io.*;
     4 import java.net.*;
     5 
     6 public class WebServer {
     7 
     8     /**
     9      * web服务器:实现200和404操作
    10      * 原理:
    11      * 服务器监听一个端口,并读取浏览器的请求信息,从该信息提取出访问的资源(这里为文件名)。并在工作目录下查找是否有该资源,有则输出资源内容,否则返回404
    12      * 测试方法:
    13      * 1、用String path=System.getProperty("user.dir");获取当前的工作目录,并在该目录下放要测试的文件
    14      * 2、访问127.0.0.1:8080/test.html
    15      */
    16     public static void main(String[] args) {
    17         // TODO Auto-generated method stub
    18         ServerSocket server = null;
    19         Socket s=null;
    20         try
    21         {
    22             server=new ServerSocket(8080,3,InetAddress.getByName("127.0.0.1"));
    23         }catch(Exception e)
    24         {
    25             e.printStackTrace();
    26         }
    27         while(true)
    28         {
    29             try{
    30                 s=server.accept();
    31                 OutputStream output=s.getOutputStream();
    32                 InputStream input=s.getInputStream();
    33                 
    34                 //接收请求信息
    35                 Request request=new Request(input);
    36                 String filename=request.getUri();
    37                 //System.out.println(filename);
    38                 
    39                 //处理并响应请求信息
    40                 Response response=new Response(output,filename);
    41                 response.response();
    42 
    43             }catch(Exception e)
    44             {
    45                 e.printStackTrace();
    46             }
    47         }
    48     }
    49 
    50 }

     二.Request.java内容:

     1 package webserver;
     2 import java.io.*;
     3 public class Request {
     4     /*
     5      * 接收请求的信息,并返回资源(文件名)
     6      * */
     7     InputStream input;
     8     public Request(InputStream input)
     9     {
    10         this.input=input;
    11     }
    12     public String getUri() throws IOException
    13     {
    14         String content=null,str=null;
    15         StringBuffer request = new StringBuffer();  
    16         byte[] buffer = new byte[2048];  
    17         int i = 0;  
    18           
    19         try {  
    20             i = input.read(buffer);  //读取内容并存入buffer数组中,并返回读取的的字节数。
    21         } catch (IOException e) {  
    22             e.printStackTrace();  
    23             i = -1;  
    24         }  
    25         //将buffer数组转换为字符串
    26         for(int k = 0; k < i; k++) {  
    27             request.append((char)buffer[k]);  
    28         }  
    29         content=request.toString();
    30     /*    
    31      *以下方法错误!用该返回会使浏览器不断处于请求连接状态
    32      * BufferedReader br=new BufferedReader(new InputStreamReader(input));
    33         while((str=br.readLine())!=null)
    34         {
    35             content=content+str+"
    ";
    36         }
    37     */    
    38         if(content!=null)
    39             return getFilename(content);
    40         else return null;
    41     }
    42     /*提取文件名*/
    43     public String getFilename(String content)
    44     {
    45         int a,b;
    46         a=content.indexOf(' ');
    47         if(a!=-1)
    48         {
    49             b=content.indexOf('?',a+1);
    50             if(b==-1)b=content.indexOf(' ',a+1);
    51             return content.substring(a+2,b);
    52         }
    53         return null;
    54     }
    55 }

     三.Response.java:

     1 package webserver;
     2 
     3 import java.io.*;
     4 import java.io.File;
     5 import java.io.IOException;
     6 import java.io.OutputStream;
     7 
     8 public class Response {
     9     /**
    10      * 响应并处理请求信息
    11      */
    12     public OutputStream output;
    13     public String filename;
    14      private static final int BUFFER_SIZE = 1024; 
    15     public  Response(OutputStream output,String filename)
    16     {
    17         this.output=output;
    18         this.filename=filename;
    19     }
    20     public void response() throws IOException
    21     {
    22         String path=System.getProperty("user.dir");//获取当前的工作目录
    23         byte[] buffer = new byte[BUFFER_SIZE];  
    24         int ch;  
    25         FileInputStream fis = null;  
    26         //System.out.println(path+File.separator+filename);
    27         if(path!=null&&filename!=null)
    28         {
    29             File file=new File(path,filename);
    30             String str="";
    31             /*必须添加响应头,否则无法以html格式显示内容*/
    32             if(file.exists())
    33             {
    34                 fis = new FileInputStream(file);  
    35                 str = "HTTP/1.1 200 OK 
    " +  
    36                  "Content-Type: text/html
    " +  
    37                  "
    " ;
    38                 output.write(str.getBytes());
    39                 ch = fis.read(buffer);                
    40                 while(ch != -1) {  
    41                     output.write(buffer, 0, ch);  
    42                     ch = fis.read(buffer, 0, BUFFER_SIZE);  
    43                 }  
    44             }
    45             else
    46             {
    47                  str = "HTTP/1.1 404 File Not Found 
    " +  
    48                  "Content-Type: text/html
    " +  
    49                  "Content-Length: 100
    " +  
    50                  "
    " +  
    51                  "<h1>404 File Not Found!</h1>"; 
    52                 output.write(str.getBytes());
    53             }
    54         }
    55         output.close();
    56     }
    57 }

    四.测试效果:

     

    五.web服务器原理简介:

      (详情参考:https://blog.csdn.net/qq_36359022/article/details/81666221)

      过程介绍:

        (1) 用户做出了一个操作,可以是填写网址敲回车,可以是点击链接,可以是点击按键等,接着浏览器获取了该事件。
        (2) 浏览器与对端服务程序建立TCP连接。
        (3) 浏览器将用户的事件按照HTTP协议格式**打包成一个数据包,其实质就是在待发送缓冲区中的一段有着HTTP协议格式的字节流。
        (4) 浏览器确认对端可写,并将该数据包推入Internet,该包经过网络最终递交到对端服务程序。
        (5) 服务端程序拿到该数据包后,同样以HTTP协议格式解包,然后解析客户端的意图。
        (6) 得知客户端意图后,进行分类处理,或是提供某种文件、或是处理数据。
        (7) 将结果装入缓冲区,或是HTML文件、或是一张图片等。
        (8) 按照HTTP协议格式将(7)中的数据打包
        (9) 服务器确认对端可写,并将该数据包推入Internet,该包经过网络最终递交到客户端。
        (10) 浏览器拿到包后,以HTTP协议格式解包,然后解析数据,假设是HTML文件。
        (11) 浏览器将HTML文件展示在页面
        以上为Web服务器工作基本原理。其实不难发现,这仅仅只是一个简单的网络通信。我们应该深信,作为一个服务器,其根本的工作无非有三个:

          1.接收数据 2. 发送数据 3. 数据处理
          而Web服务器的本质就是 接收数据 ⇒ HTTP解析 ⇒ 逻辑处理 ⇒ HTTP封包 ⇒ 发送数据
          高级的服务器无非就是将这三个部分更加细致的设计了。

  • 相关阅读:
    “猫癣”集团借IE7新漏洞再掀风浪 狼人:
    研究人员在黑帽安全大会演示SSL攻击 狼人:
    猫癣病毒“躲猫猫” 移师广东东莞月入百万 狼人:
    Adobe两款软件存在缺陷 黑客可控制用户PC 狼人:
    安全观点:遭遇数据泄露破坏 损失的不只是金钱 狼人:
    McAfee报告称七成手机制造商认为手机安全至关重要 狼人:
    微软表示本月将发布五个Windows 7更新 狼人:
    Gmail电子邮件曝全球性故障 谷歌向用户道歉 狼人:
    Google Talk被黑客利用 发动钓鱼攻击 狼人:
    谷歌GMail邮件服务出现故障 部分服务已恢复 狼人:
  • 原文地址:https://www.cnblogs.com/lyq-biu/p/10538651.html
Copyright © 2011-2022 走看看