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

    web服务器原理

      一、参照博客,复制代码到idea中。在src包中建立Request.java文件,代码如图:

      

    
    
    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文件

    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)
            {
                System.out.println(path+File.separator+filename);
                File file=new File(path,filename);
                String str="";
                /*必须添加响应头,否则无法以html格式显示内容*/
                if(file.exists())
                {
    //                System.out.println(1111);
                    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) {
                        System.out.println(ch);
                        output.write(buffer, 0, ch);
                        ch = fis.read(buffer, 0, BUFFER_SIZE);
                    }
                }
                else
                {
    //                200 OK
                    str = "HTTP/1.1 200 File Not Found 
    " +
                            "Content-Type: text/html
    " +
                            "Content-Length: 100
    " +
                            "
    " +
                            "<h1>404 File Not Found!</h1>"+
                            "
    " +
                            "2222";
                    System.out.println(str);
                    File fil=new File(path,"123.html");
                    fis = new FileInputStream(fil);
                    output.write(str.getBytes());
                    ch = fis.read(buffer);
                    while(ch != -1) {
                        System.out.println(ch);
                        output.write(buffer, 0, ch);
                        ch = fis.read(buffer, 0, BUFFER_SIZE);
                    }
    
    
    //                output.write(str.getBytes());
                }
            }
            output.close();
        }
    }

      建立服务器java类:WebServer.java

    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(11113,3,InetAddress.getByName("127.0.0.1"));
    //            server=new ServerSocket(8080);
            }catch(Exception e)
            {
                e.printStackTrace();
            }
            while(true)
            {
                try{
                    s=server.accept();
    
                        System.out.println(s.toString());
                        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)
                {
                    System.out.println("111");
                    e.printStackTrace();
                }
            }
        }
    
    }

    一、服务器端口占用问题

    第一次运行后,在游览器端访问的时候抛出异常如下:

    经过逐次排查和百度后发现是new ServerSocket()传入参数时的端口占有问题,抛出的常见异常为ServerSocket为空指针异常,因为idea里为Tomcat配置的默认端口为8080,可能在后台运行着其它Servlet服务,或者对该Web服务器存在着多次的启动。

    解决方法: 1.修改传入参数为其他的端口。

          2.查看自己的idea或者eclipse是否存在如下图的服务器的多次启动问题,此时头一个服务器并没有关闭,所以存在了端口的占用。

    二、游览器劫持404,拦截自定义的404页面

     在没有建立自己工程下的HTML文件时,游览器访问会出现如图所示的问题,并不是自己定义404页面

    解释:测试了几个不同的游览器对此404问题的解决方法,和修改Response中字符串的响应头404为202等便可以正常显示如下:

    三、建立html文件的路径问题

      学习过Servlet的朋友习惯下会把src或者web目录作为HTML访问的根目录(是因为Tomcat服务器经过处理),所以经常在测试的时候把.html,.jsp等文件建立在这两个目录下。但是自定义web服务器中,我们是通过System.getProperty("user.dir")方法获取当前的工作目录,所以.html文件需要建立在与src,web等相同的目录下才可以正常访问。

    四、web服务器的运行流程

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

      连接过程就是web服务器和其游览器之间建立的一种连接,查看连接过程是否实现,用户可以找到和打开socket这个虚拟文件,这个文件的建立意味着连接过程已经成功建立。

      请求过程就是web的服务器运用socket这个文件向其服务发出的各种请求。

      应答过程就是运用http协议把在请求过程中所提出的请求传输到web的服务器,进而实施任务处理,然后运用http协议与把处理结果传输到web的游览器,由游览器进行解析和渲染过程。

      关闭连接就是完成应答过程后服务器和游览器之间断开的过程。

  • 相关阅读:
    .a包生成64位
    iOS教程
    iOS 难题解决日志------2层控制器 上面的控制器显示透明
    企业级的App发布流程
    如何从oc中去获取一个私有的变量.....
    iOS app的破解原理,就是去除已付费的账户信息的原理是什么?
    Could not launch "app_name"
    GCD时间轴
    Win8自动更新怎么关闭 取消Win8自动更新
    python3 elf文件解析
  • 原文地址:https://www.cnblogs.com/xjtsh/p/10522642.html
Copyright © 2011-2022 走看看