常見客戶端與服務端
客戶端:
瀏覽器: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 }
整理的有些粗糙,大家多提一下建議哈。