zoukankan      html  css  js  c++  java
  • Java web实现原理

    说明

    最近在看一本java web和tomcat技术介绍的书籍。故此,希望通过文字总结的方式总结自己学习所获,本篇主要介绍java实现web基本的信息浏览的方法原理。

    web的本质

    由于技术能力有限,或许我的表述存在某些问题,仅供参考。web网页技术其本质包括三个要素:访问用户、浏览器(软件)、访问地址(Url).三个基本的要素构成了一次简单的网页浏览的过程。其中访问用户为数据被动接收者,浏览器为数据加工者(根据既定规则展示数据),访问地址为数据获取(也可以理解为数据提供方)。由此可见,web的基础就是对于数据的获取和数据的展示,展示本篇不做介绍,主要介绍浏览器如何通过url获取网页数据的。

    web实现

    web构成主要就两个部分:服务端和客户端。而web的访问其实就是一次简单的net间的数据传输,web是基于TCP/IP协议簇的HTTP来规范通信过程,而基本的通信过程其实就是一次tcp方式连接get的请求过程。浏览器通过get方式获取当前的浏览信息(html或者其他资源文件信息)。如下,简单介绍有关http协议的的基本格式信息内容以及如何通过java程序模拟实现一次简单的网页访问。

    1) HTTP协议
    HTTP(HyperText Transfer Protocol)为超文本传输协议,这是万维网通信文件均需要遵循的标准。初期是为了专门处理超文本(html)数据传输的方法,后来慢慢规范,现在已经成为网络通信的一个基础的请求应答通信协议,成为首选的通信协议。HTTP规范了net请求过程中数据格式,规定了请求数据和响应数据格式。HTTP主要将通信数据分为三个部分方法(method)、头部(Header)、正文(Body)其中通过” ”将正文与方法和头部进行分离。如下简单介绍一些常用的请求格式:

    • 请求格式
      请求格式分为三个部分组成:请求方法、请求头、请求体,如下给出一个简单的请求格式示例:

      GET / HTTP/1.1
      Host: www.enjoytoday.cn
      Connection: keep-alive
      Upgrade-Insecure-Requests: 1
      User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36
      Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
      Referer: http://www.enjoytoday.cn/posts/326
      Accept-Encoding: gzip, deflate, sdch
      Accept-Language: zh-CN,zh;q=0.8
      Cookie: bdshare_firstime=1466032270994; UM_distinctid=15c4ef2ac4e2e4-0d13269271b947-1b2a120b-1fa400-15c4ef2ac4f7b5; un=aGZjYWk=; comment_author=aGZjYWk=; comment_author_email=1710600212@qq.com; comment_author_url=http://www.enjoytoday.cn; c_id=dUhIaTlndmc4MVVYbjRQTGxMRTotMTpFODg3QjgzQjg1NjgxQjQxRUYxNjg2QzJFRkMyQjI2QQ==; JSESSIONID=ADBC8C3DADF6C815D778450C193C6637.ajp13_worker; Hm_lvt_ce55bfda158556585a8b7b246346c8ba=1498560244,1498739070,1498833193,1498917432; Hm_lpvt_ce55bfda158556585a8b7b246346c8ba=1498917597; CNZZDATA1262047894=1598545996-1495973145-%7C1498917578
      
      username=hfcai&sex=man
      

      如上,首行为请求方法、URI、和http协议版本号;请求头为和请求正文以及请求返回信息相关的一一些信息,包括数据编码、请求agent、连接类型、接受数据类型等。

    • 响应格式
      响应格式也是由三部分组成:相应状态码、响应头、响应体。其格式如下所示:

      HTTP/1.1 200 OK
      Date: Sat, 01 Jul 2017 14:51:26 GMT
      Server: Apache/2.4.7 (Ubuntu)
      Set-Cookie: JSESSIONID=84C993F5E433C4DE9BFBA57150FFC065.ajp13_worker;path=/;HttpOnly
      Content-Language: zh-CN
      Vary: Accept-Encoding
      Content-Encoding: gzip
      Content-Length: 7333
      Keep-Alive: timeout=5, max=100
      Connection: Keep-Alive
      Content-Type: text/html;charset=UTF-8
      
      <html>
      <head>
      <title>title of html.</html>
      </head>
      <body>
      <h1>Hello world!</h1>
      </body>
      </html>

      如上,首行为Http协议版本号和返回状态码、返回描述信息(状态码由3位数字组成,200为成功接收返回),响应头包括服务器使用的服务容器类型版本、响应体数据类型、编码、长度等信息,最后响应体就是我们需要请求返回的数据,url访问返回的也就是html文本信息了。

    2) Java实现一个简单的url访问web
    为了能让浏览器通过url直接访问到我们的网页,我们需要通过java完成一个socket服务端,来模拟返回,代码如下:

    
       public class HTTPServer {
    
        public static void main(String[] args) {
            int port=9000;
            if (args!=null && args.length>0 && args[0]!=null && args[0].trim().length()>0) {
                port=Integer.parseInt(args[0]);
            }
    
            ServerSocket serverSocket=null;
            try {
                serverSocket=new ServerSocket(port);
                System.out.printf("[*] Listener success,and address  %s",serverSocket.getLocalSocketAddress().toString());
    
                while (true) {
                    Socket socket=serverSocket.accept();
                    System.out.printf("[*]Receiver Request,from %s:%d",socket.getInetAddress().getHostAddress(),socket.getPort());
                    handl_client(socket);
    
                }
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
                System.out.printf("[*] Listener failed,and address  %s",serverSocket.getLocalSocketAddress().toString());
                try {
                    serverSocket.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
    
        }
    
    
        private static void handl_client(Socket socket) throws Exception{
            DataInputStream dataInputStream=new DataInputStream(socket.getInputStream());
            DataOutputStream outputStream=new DataOutputStream(socket.getOutputStream());
    
            int size=dataInputStream.read();
            byte[] bs=new byte[size];
            dataInputStream.read(bs);
    
            String request=new String(bs);
            System.out.println("[*]Request content is:"+request);
    
            String requestParams=request.substring(0,request.indexOf("
    ")).split(" ")[1];
            String contentType;
            if (requestParams.indexOf("html") !=-1 || requestParams.indexOf("htm")!=-1){
                contentType="text/html";
            }else if(requestParams.indexOf("jpg")!=-1 || requestParams.indexOf("jpeg")!=-1) {
                contentType="image/jpeg";
            }else if(requestParams.indexOf("gif")!=-1){
                contentType="image/gif";
            }else {
                contentType="application/octet-stream";
            }
    
            String firstLine="HTTP/1.1 200 ok
    ";
            String responseHeader="Content-Type:"+contentType+"
    
    ";
            InputStream in=HttpServer.class.getResourceAsStream("html"+File.separator+requestParams);
            outputStream.write(firstLine.getBytes());
            outputStream.write(responseHeader.getBytes());
            int len=0;
            bs=new byte[128];
            if (in!=null) {
                while ((len=in.read(bs))!=-1) {
                    outputStream.write(bs,0,len);           
                }
            }
            in.close();
            outputStream.close();
            dataInputStream.close();
            socket.close();
        }
       }

    编译生成HTTPServer.class 运行监听请求,通过浏览器访问:http://localhost:9000/index.html, 浏览器返回显示如下:

    显示图片

  • 相关阅读:
    Centos7上安装docker
    另类SQL拼接方法
    多平台Client TCP通讯组件
    Redis协议详解
    .net下简单快捷的数值高低位切换
    beetle 2.7海量消息广播测试
    FileSync文件同步更新工具
    简单实现TCP下的大文件高效传输
    感知机原理小结
    日志和告警数据挖掘经验谈
  • 原文地址:https://www.cnblogs.com/amiko/p/7906222.html
Copyright © 2011-2022 走看看