• web服务器原理


    Web系统由客户端(浏览器)和服务器端两部分组成。Web系统架构也被称为B/S架构。最常见的Web服务器有Apache、IIS等,常用的浏览器有IE、Firefox、chrome等。当你想访问一个网页时,需要在浏览器的地址栏中输入该网页的URL(Uniform Resource Locator,简称为URL)地址,或者是通过超链接链接到该网页。浏览器会向该网页所在的服务器发送一个HTTP请求,服务器会对接收到的请求信息进行处理,然后将处理的结果返回给浏览器,最终将浏览器处理后的结果呈现给用户。

    WEB简介

        Web服务器是可以向发出请求的浏览器提供文档的程序。
        1、服务器是一种被动程序:只有当Internet上运行在其他计算机中的浏览器发出请求时,服务器才会响应。
        2 、最常用的Web服务器是Apache和Microsoft的Internet信息服务器(Internet Information Services,IIS)。
        3、Internet上的服务器也称为Web服务器,是一台在Internet上具有独立IP地址的计算机,可以向Internet上的客户机提供WWW、Email和FTP等各种Internet服务。
        4、Web服务器是指驻留于因特网上某种类型计算机的程序。当Web浏览器(客户端)连到服务器上并请求文件时,服务器将处理该请求并将文件反馈到该浏览器上,附带的信息会告诉浏览器如何查看该文件(即文件类型)。服务器使用HTTP(超文本传输协议)与客户机浏览器进行信息交流,这就是人们常把它们称为HTTP服务器的原因。
    Web服务器不仅能够存储信息,还能在用户通过Web浏览器提供的信息的基础上运行脚本和程序。

    工作原理

        Web服务器的工作原理并不复杂,一般可分成如下4个步骤:连接过程、请求过程、应答过程以及关闭连接。

    (1)客户端发送请求

      客户端(通过浏览器)和Web服务器建立TCP连接,连接建立以后,向Web服务器发出访问请求(如get)。根据HTTP协议,该请求中包含了客户端的IP地址、浏览器的类型和请求的URL等一系列信息。

    (2)服务器解析请求

      Web服务器对请求按照HTTP协议进行解码来确定进一步的动作,设计的内容有三鼐要点:方法(GET)、文档(/sample.html)、和浏览器使用的协议(HTTP/1.1)其中方法告诉服务器应完动的动作,GET方法的含义很明显是:服务器应定位、读取文件并将它返回给客户。

    Web服务器软件现在就知道了,它应该找到文件/sample.html,并使用HTTP/1.1协议将内存返回给客户。信息是经过与请求到来相同的连接发出的,所以服务器不需要定们客户或创建新的连接。

    (3)读取其它信息(非必须步骤)

        Web服务器根据需要去读取请求的其它部分。在HTTP/1.1下,客户还应给服务器提供关于它的一些信息。元信息(metainformation)可用来描述浏览器及其能力,以使服务器能据此确定如何返回应答。

    (4)完成请求的动作

      若现在没有错误出现,WWW服务器将执行请求所要求的动作。要获取(GET)一个文档,web服务器在其文档树中搜索请求的文件(/sample.html)。这是由服务器机器上作为操作系统一部分的文件系统完成的。若文件能找到并可正常读取,则服务器将把它返回给客户。

    如果成功:文件被发送出去。

      首先,web服务器发送一个状态码及一些描述信息。既然文件已经找到,则发送状态码200,表示一切都OK ,文档随后发出,因为发送的信息是HTML文档,所以Content-type 取值为text/html。文档长为1024个字节,所以Content-type 取1024 。服务器软件的标识及文件的时间属性信息也被包含在头域中。

    如果失败:返回错误指示。

      如果请求的文件没有找到或找到但无法读取,测请求无法满足。这时将返回不同于200的状态码。最常见的问题是请求中的文件名拼写有误,所以服务器无法找到该文件。这种情况下,服务器将发送一个状态码---404 给客户。

    (5)关闭文件和网络连接,结束会话。

    当文件已被发邮或错误已发出后,web服务器结束整个会话。它关闭打开的的被请求文件,关闭网络端口从而结束网络连接。有关的其它工作则是由客户端来完成的,包括接收数据,并以用户可读的方式呈现出来。这些与服务器无关。

     

    代码

    一、WebServer.java文件

    package webserver;

    import java.io.*;
    import java.net.*;

    public class WebServer {

    /**
    * web服务器:实现200和404操作
    * 原理:
    * 服务器监听一个端口,并读取浏览器的请求信息,从该信息提取出访问的资源(这里为文件名)。并在工作目录下查找是否有该资源,有则输出资源内容,否则返回404
    * 测试方法:
    * 1、用String path=System.getProperty("user.dir");获取当前的工作目录,并在该目录下放要测试的文件
    * 2、访问127.0.0.1:8080/test.html
    */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    ServerSocket server = null;
    Socket s=null;
    try
    {
    server=new ServerSocket(8080,3,InetAddress.getByName("127.0.0.1"));
    }catch(Exception e)
    {
    e.printStackTrace();
    }
    while(true)
    {
    try{
    s=server.accept();
    OutputStream output=s.getOutputStream();
    InputStream input=s.getInputStream();

    //接收请求信息
    Request request=new Request(input);
    String filename=request.getUri();
    //System.out.println(filename);

    //处理并响应请求信息
    Response response=new Response(output,filename);
    response.response();

    }catch(Exception e)
    {
    e.printStackTrace();
    }
    }
    }

    }

    二、request.java文件

    package webserver;
    import java.io.*;
    public class Request {
    /*
    * 接收请求的信息,并返回资源(文件名)
    * */
    InputStream input;
    public Request(InputStream input)
    {
    this.input=input;
    }
    public String getUri() throws IOException
    {
    String content=null,str=null;
    StringBuffer request = new StringBuffer();
    byte[] buffer = new byte[2048];
    int i = 0;

    try {
    i = input.read(buffer); //读取内容并存入buffer数组中,并返回读取的的字节数。
    } catch (IOException e) {
    e.printStackTrace();
    i = -1;
    }
    //将buffer数组转换为字符串
    for(int k = 0; k < i; k++) {
    request.append((char)buffer[k]);
    }
    content=request.toString();
    /*
    *以下方法错误!用该返回会使浏览器不断处于请求连接状态
    * BufferedReader br=new BufferedReader(new InputStreamReader(input));
    while((str=br.readLine())!=null)
    {
    content=content+str+" ";
    }
    */
    if(content!=null)
    return getFilename(content);
    else return null;
    }
    /*提取文件名*/
    public String getFilename(String content)
    {
    int a,b;
    a=content.indexOf(' ');
    if(a!=-1)
    {
    b=content.indexOf('?',a+1);
    if(b==-1)b=content.indexOf(' ',a+1);
    return content.substring(a+2,b);
    }
    return null;
    }
    }

    三、response.java

    package webserver;

    import java.io.*;
    import java.io.File;
    import java.io.IOException;
    import java.io.OutputStream;

    public class Response {
    /**
    * 响应并处理请求信息
    */
    public OutputStream output;
    public String filename;
    private static final int BUFFER_SIZE = 1024;
    public Response(OutputStream output,String filename)
    {
    this.output=output;
    this.filename=filename;
    }
    public void response() throws IOException
    {
    String path=System.getProperty("user.dir");//获取当前的工作目录
    byte[] buffer = new byte[BUFFER_SIZE];
    int ch;
    FileInputStream fis = null;
    //System.out.println(path+File.separator+filename);
    if(path!=null&&filename!=null)
    {
    File file=new File(path,filename);
    String str="";
    /*必须添加响应头,否则无法以html格式显示内容*/
    if(file.exists())
    {
    fis = new FileInputStream(file);
    str = "HTTP/1.1 200 OK " +
    "Content-Type: text/html " +
    " " ;
    output.write(str.getBytes());
    ch = fis.read(buffer);
    while(ch != -1) {
    output.write(buffer, 0, ch);
    ch = fis.read(buffer, 0, BUFFER_SIZE);
    }
    }
    else
    {
    str = "HTTP/1.1 404 File Not Found " +
    "Content-Type: text/html " +
    "Content-Length: 100 " +
    " " +
    "<h1>404 File Not Found!</h1>";
    output.write(str.getBytes());
    }
    }
    output.close();
    }
    }

    结果

  • 相关阅读:
    ld: warning: PIE disabled. Absolute addressing (perhaps -mdynamic-no-pic) not allowed in code signed PIE, but used in _ff_h264_decode_mb_cabac from
    关于屏幕旋转的几种情况
    AppCan应用打包关于缺少XMPP的依赖库libresolv.dylib--升级引擎版本到3.1以上
    "_dns_parse_resource_record", referenced from:......
    export IPHONEOS_DEPLOYMENT_TARGET=6.0 .......
    CodeSign error: code signing is required for product type Application in SDK iOS
    Receiver type ‘X’ for instance message is a forward declaration
    uva299
    uva152
    uva10474
  • 原文地址:https://www.cnblogs.com/hechunhang/p/10539922.html
Copyright © 2020-2023  润新知