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 }

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

原文地址:https://www.cnblogs.com/Liang-Blog/p/5643282.html