web服务器的原理

Posted 钟万祥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了web服务器的原理相关的知识,希望对你有一定的参考价值。

概述:Web服务器概念较为广泛,我们最常说的Web服务器指的是网站服务器,它是建立在Internet之上并且驻留在某种计算机上的程序。Web服务器可以向Web客户端(如浏览器)提供文档或其他服务,只要是遵循HTTP协议而设计的网络应用程序都可以是Web客户端。

Web服务器和HTTP服务器可以说是同一个东西,当然非得细分的话,HTTP服务器是建立在HTTP协议之上的提供文档浏览的服务器,更多的是提供静态的文件。而Web服务器涵盖了HTTP服务器(这一点可以自行百度百科), Web服务器不仅能够存储信息,还能在用户通过Web浏览器提供的信息的基础上运行脚本和程序。

Web服务器工作原理图解

 

Web服务器之提供静态文件工作原理图解


Web服务器之数据提交工作原理图解

 参考https://www.cnblogs.com/yingww/p/4097620.htm实现了一个简单的webserver

1、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();
            }
        }
    }

}

  

2、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+"\\r\\n";
        }
    */    
        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;
    }
}

  

3、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 \\r\\n" +  
                 "Content-Type: text/html\\r\\n" +  
                 "\\r\\n" ;
                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 \\r\\n" +  
                 "Content-Type: text/html\\r\\n" +  
                 "Content-Length: 100\\r\\n" +  
                 "\\r\\n" +  
                 "<h1>404 File Not Found!</h1>"; 
                output.write(str.getBytes());
            }
        }
        output.close();
    }
}

 运行结果

 

以上是关于web服务器的原理的主要内容,如果未能解决你的问题,请参考以下文章

markdown 在Intel Nuc上设置Ubuntu Web服务器,步骤和代码片段

Apollo Codegen 没有找到生成代码的操作或片段

web代码片段

JAVA WEB代码片段

高效Web开发的10个jQuery代码片段

高效Web开发的10个jQuery代码片段