Http協議以及模擬http請求發送數據
1 為什麽要使用http協議
假設我現在有兩個客戶端瀏覽器,一個是google,一個是IE瀏覽器;我現在有兩個服務器,一個是tomcat,一個是JBoss;在最初的情況下是:如果google要往tomcat上發送數據,就一定要在消息的前面加上google;比如google:helloWorld!此時tomcat上需要接受數據,假設tomcat接受 數據的數據格式是:apache:helloWorld!;此時問題出現了,我們該怎麽識別數據,同樣的IE瀏覽器要往tomcat發送相同的數據,格式是IE:helloWorld!。此時該怎麽辦?
而且問題不單單這麽簡單;如果google瀏覽器和IE瀏覽器向JBoss服務器發送數據,JBoss如果接收數據的格式是redhat:helloWorld!.此時情況就要復雜的多;這樣看來除非自家的服務器識別自家的瀏覽器;我們不能要求用戶使用指定的瀏覽器訪問指定的網頁;實際中,我們確實可以使用任何瀏覽器訪問任何網頁。這就是因為有了http協議。http默認是無狀態的,而且端口為80端口;只有客戶端和服務端都遵循這個協議,數據的發送和接受就可以統一了,在任何服務器或者瀏覽器上都可以識別;
那麽Http協議究竟是怎麽對請求數據的格式和響應數據的格式做規定了;請看如下的敘述:
·1 HTTP協議請求數據的格式
比如我訪問http://www.importnew.com/27777.html這個網頁,此時我們可以查看網絡;F12查看:
1)請求方式:包括資源的URI(統一資源定位符,這裏可以理解為除去域名的資源地址)和請求方式(GET/POST。。。)
2)請求頭
3)請求正文
比如GET請求表單提交時username=xxx&pwd=xxx;在這裏需要註意的是請求頭和請求正文之間存在一行空格;表示請求頭結束;
2 http的版本
HTTP1.0
比如我們訪問一個網頁,存在8個資源,每一個資源都會建立一次連接,發送一次數據,響應一次數據,關閉一次連接,總共是8次連接,8次數據發送,8次數據的響應,8次連接的關閉;建立連接和關閉連接很消耗性能;
HTTP1.1
比如我們訪問一個網頁,存在8個資源,只會建立一次連接,每訪問一個資源發送一次數據,響應一次數據;最終只會關閉一次連接,總共是1次連接,8次數據發送,8次數據的響應,1次連接的關閉;改善了性能。
3 模擬httpClient發送數據
在這裏我訪問我自己的項目,部署在tomcat下;地址是http://localhost:8080/leoshop/AboutBlank.jsp
以下的代碼是我模擬httpClient的GET請求;響應內容是jsp頁面的源代碼:
package com.asiaInfo.caozg.ch_01; import java.net.*; import java.io.*; public class HttpClient { String host = "localhost"; int port = 8080; Socket socket; public void createSocket() throws Exception { socket = new Socket(host, port); } public void communicate() throws Exception { StringBuffer sb = new StringBuffer("GET " + "/leoshop/AboutBlank.jsp" + " HTTP/1.1\r\n"); sb.append("Host: localhost:8080\r\n"); sb.append("Accept: */*\r\n"); sb.append("Accept-Language: zh-cn\r\n"); sb.append("Accept-Encoding: gzip, deflate\r\n"); sb.append("User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 10.0)\r\n"); sb.append("Connection: Keep-Alive\r\n\r\n"); //發出HTTP請求 OutputStream socketOut = socket.getOutputStream(); socketOut.write(sb.toString().getBytes()); socket.shutdownOutput(); //關閉輸出流 InputStream socketIn = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(socketIn, "UTF-8")); String data; while ((data = br.readLine()) != null) { System.out.println(data); } socket.close(); } public static void main(String args[]) throws Exception { HttpClient client = new HttpClient(); client.createSocket(); client.communicate(); } }
響應內容:
HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=8C02608AB1DBB0ED3608D9229C663002; Path=/leoshop; HttpOnly Content-Type: text/html;charset=UTF-8 Transfer-Encoding: chunked Date: Sat, 13 Jan 2018 17:32:17 GMT <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> ...... <head> </head> </body> ...... </body> </html>
Http協議以及模擬http請求發送數據