zoukankan      html  css  js  c++  java
  • java网络编程客户端与服务端原理以及用URL解析HTTP协议

    常见客户端与服务端

      客户端:

        浏览器:IE

      服务端:

        服务器:web服务器(Tomcat),存储服务器,数据库服务器。

    (注:会用到Tomact服务器,在webapps下有一个自己创建的目录myweb,下面有一个文件1.html)

    服务端原理

      自定义一个服务端,使用自己已有的客户端IE浏览器,了解一下客户端都发送了什么请求。

      

     1 package cn.ie_server;
     2 
     3 import java.io.IOException;
     4 import java.io.InputStream;
     5 import java.io.PrintWriter;
     6 import java.net.InetSocketAddress;
     7 import java.net.ServerSocket;
     8 import java.net.Socket;
     9 
    10 import cn.InetAdress.demo.InetAddressDemo2;
    11 
    12 public class MyTomcat {
    13 
    14     public static void main(String[] args) throws IOException {
    15         //建立服务端的socket连接,监听9090端口
    16         ServerSocket ss=new ServerSocket(9090);
    17         //接收客户端发来的消息
    18         Socket s=ss.accept();
    19         
    20         System.out.println(s.getInetAddress().getHostAddress());
    21         
    22         //获取客户端发送过来的请求
    23         InputStream in=s.getInputStream();
    24         
    25         byte [] buf=new byte[1024];
    26         
    27         int len=in.read(buf);
    28     
    29         String text=new String(buf,0,len,"utf-8");
    30         
    31         System.out.println(text);    
    32         //向客户端发送一些数据
    33         PrintWriter out=new PrintWriter(s.getOutputStream(),true);
    34         out.println("<font color='red' size='7'>欢迎光临</font>");
    35         s.close();
    36         ss.close();
    37     }
    38 }

      发送过来的请求是:

      GET / HTTP/1.1 (请求行: 请求方式 请求资源路径/myweb/1.html http协议版本)
      (请求消息头,属性名:属性值 )
      Accept: text/html, application/xhtml+xml, image/jxr, */*
      Accept-Language: zh-Hans-CN,zh-Hans;q=0.8,en-US;q=0.5,en;q=0.3
      User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)   Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586
      (支持的压缩方式)
      Accept-Encoding: gzip, deflate
      Host: 127.0.0.1:9090
      Connection: Keep-Alive8

    注意:这此时开放端口后可能会连不上服务端出现以下情况

    此时可以试一下将ip换成127.0.0.1 这个回送地址,因为如果在校园会出现访问限制的情况

    客户端原理

      服务端给客户端的应答消息,模拟一个Tomcat服务端发送符合http协议的请求消息

     1 package cn.ie_server;
     2 
     3 import java.io.IOException;
     4 import java.io.InputStream;
     5 import java.io.ObjectInputStream.GetField;
     6 import java.io.PrintWriter;
     7 import java.net.Socket;
     8 import java.net.UnknownHostException;
     9 
    10 public class MyBrowser {
    11 
    12     /**
    13      * @param args
    14      * @throws IOException 
    15      * @throws UnknownHostException 
    16      */
    17     public static void main(String[] args) throws UnknownHostException, IOException {
    18         Socket s=new Socket("192.168.1.127",8080);
    19         
    20         //模拟浏览器给tomcat服务端发送符合http协议的请求消息
    21         PrintWriter out=new PrintWriter(s.getOutputStream(),true);
    22         out.println("GET /docs/aio.html HTTP/1.1");
    23         out.println("Accept: */*");
    24         out.println("Host: 192.168.1.127:8080");
    25         out.println("Connection:close");
    26         out.println();
    27         out.println();
    28         
    29         InputStream in=s.getInputStream();
    30         byte[] buf=new byte[1024];
    31         int len=in.read(buf);
    32         
    33         String str=new String(buf,0,len);
    34         System.out.println(str);
    35         
    36         s.close();
    37         
    38     }
    39 
    40 }

      服务端返回的应答消息为:

    (应答行 应答状态码 应答状态行描述信息)
    HTTP/1.1 200 OK
    (应答消息属性 属性名:属性值 )
    Server: Apache-Coyote/1.1
    Accept-Ranges: bytes
    ETag: W/"24874-1465990848000"
    Last-Modified: Wed, 15 Jun 2016 11:40:48 GMT//最后修改时间
    Content-Type: text/html
    Content-Length: 24874
    Date: Mon, 04 Jul 2016 14:54:43 GMT
    Connection: close
    //空行
    //应答体

    <html>
    <head>
    <title>这是我的网页</title>
    </head>

    <body>

    <h1>欢迎光临</h1>

    <font size='5' color="red">这是一个Tomcat服务器中的资源。这是一个html网页。</font>

    </body>

    </html>

    注意:通常我们找不到网页,会出现404的应答状态码,而成功的话会返回200的应答状态码。

      大家可以看到服务端返回的消息中有“应答行 应答状态码 应答状态行描述信息”等等一系列信息,但为什么在浏览器中只有我们看到的普通网页呢,这是因为浏览器进行了解析,但是怎么解析呢?只是就用到了URL这个类。

     1 package cn.ie_server;
     2 
     3 import java.io.IOException;
     4 import java.io.InputStream;
     5 import java.io.OutputStream;
     6 import java.net.MalformedURLException;
     7 import java.net.URL;
     8 import java.net.URLConnection;
     9 
    10 public class URLDemo {
    11 
    12     /**
    13      * @param args
    14      * @throws IOException 
    15      */
    16     public static void main(String[] args) throws IOException {
    17         String str_url="http://127.0.0.1:8080/myweb/1.html?name=zhangsan";
    18         
    19         URL url=new URL(str_url);
    20                 InputStream in=url.openStream();
    21                 byte[]buf=new byte[1024];
    22         int len =in.read(buf);
    23         String text=new String(buf ,0,len);
    24         System.out.println(text);
    25         in.close();
    26     }
    27 
    28 }

    整理的有些粗糙,大家多提一下建议哈。

  • 相关阅读:
    微信小程序之授权 wx.authorize
    微信小程序之可滚动视图容器组件 scroll-view
    纯 CSS 利用 label + input 实现选项卡
    Nuxt.js + koa2 入门
    koa2 入门(1)koa-generator 脚手架和 mongoose 使用
    vue 自定义指令
    时运赋
    WEBGL 2D游戏引擎研发系列 第一章 <新的开始>
    EasyUI特殊情况下的BUG整理
    数字时钟DigClock
  • 原文地址:https://www.cnblogs.com/Liang-Blog/p/5643282.html
Copyright © 2011-2022 走看看