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 }

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM