Java之HTTP網絡編程(一):TCP/SSL網頁下載
- 2021 年 2 月 23 日
- 筆記
- JAVA, Socket編程, socket網絡編程
目錄
一、簡介:HTTP程序設計
期末複習之HTTP網絡編程,主要學習記錄HTTP(s)協議的網絡編程,包括使用TCP Socket進行三次握手的HTTP網頁下載,和使用SSL Socket的安全傳輸的HTTPs網頁下載,通過案例實踐自行完成編程,認識http(s)的實際工作機制!
現在的HTTP客戶端比早期的複雜得多,不僅包括了網頁文件下載和顯示,還有許多新的功能:跨平台的顯示、參數的傳遞、動態網頁的實現和用戶交互等。
1、HTTP系統設計
- 客戶端軟件(web瀏覽器:Chrome、360瀏覽器等)
- 服務端軟件(web服務器:微軟的IIS、Apache Tomcat)
2、HTTP客戶端工作過程
- 客戶端軟件和服務器建立連接(TCP的三次握手);
- 發送HTTP頭格式協議;
- 接收網頁文件;
- 顯示網頁。
3、HTTP服務端工作過程
- 服務器軟件開啟80端口;
- 響應客戶的要求、完成TCP連接;
- 檢查客戶端的HTTP頭格式發送客戶請求的網頁文件(含動態網頁)。
圖1 HTTP請求-響應完整過程
網頁下載技術是搜索引擎、網絡爬蟲、網頁採集器或網絡推送服務等相關應用領域內的基礎技術,下面會介紹日常使用到的兩種協議(http和https)的網頁訪問下載。
二、基於TCP Socket的HTTP網頁下載
對於TCP套接字的連接過程已經有很深刻的認識了,在本地測試通信也使用過TCP的Socket建立連接,同理,與HTTP服務器建立連接,也是利用TCP進行信息交互的。
建立連接之後,需要發送HTTP請求頭,服務器確認請求者,開啟兩端的通信,客戶端可以接收網頁文件信息,進而經過渲染後顯示網頁頁面。這裡我們先實現接收網頁文件信息,在下一篇實現瀏覽器對網頁渲染之後的功能。
以www.baidu.com為例,與HTTP服務器建立連接之後,需要我們發送網頁請求,也就是HTTP請求頭。構造請求頭如下:
GET / HTTP/1.1
HOST: www.baidu.com
Accept: */*
Accept-Language: zh-cn
User-Agent: User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Connection: Keep-Alive
需要嚴格按照格式發送,並且通常用StringBuffer類的toString()方法可將完整的HTTP請求頭轉換為字符串,一致發送到HTTP服務器。
換行符使用\r\n是為了避免由於編碼問題出錯。
發送請求之後如果網頁信息顯示區返回的第一條信息是「HTTP/1.1 200 OK」,則說明訪問正常。
可以看到HTTP服務器返回許多信息,這也是響應頭,包含了許多關鍵信息內容。
三、基於SSL Socket的HTTPS網頁下載
以上面設計的基於TCP通信傳輸的HTTP,我們嘗試訪問www.sina.com.cn,結果發現響應頭信息第一行是HTTP/1.1 302 Moved Temporarily(站點被移除),出於安全考慮,現在絕大部分的web站點都將放棄HTTP而啟用HTTPS,都使用了安全加密傳輸的HTTPS協議,而關閉了HTTP,只允許啟用了SSL/TLS的HTTPS安全連接,這種連接默認是使用443端口。所以TCP Socket建立連接的方式無正常訪問網頁。
那只是端口改為443能正常嗎,答案如下。
原因在前面也能看出,需要使用SSL/TLS的HTTPS安全連接,來建立與HTTPS服務器的通信,因此需要修改Socket類型。
這裡使用到了Java安全套接字擴展(Java Secure Socket Extension,JSSE),基於SSL和TLS協議的Java網絡應用程序提供了Java API以及參考實現,這裡使用其客戶端的SSLSocket套接字。SSLSocket相對之前學習的客戶端套接字,只是創建方法不同,SSLSocket對象由SSLSocketFactory創建。
在類中聲明成員變量以及創建Socket連接:
對SSL Socket的使用與TCP相同,只是創建方法不同,經過稍微修改之後,可以成功請求HTTPS網站的網頁信息。
四、HTTP客戶端完整代碼
這裡給出HTTP客戶端的完整代碼,HTTPS只需改改上述講到的SSL Socket。
五、界面完整代碼
我直接用一個圖形界面來訪問http和https,融合以上兩個圖形客戶端的功能,使得該圖形客戶端既能訪問443的https內容,也可以訪問非443端口(一般是80)的http內容。
六、最後+演示
HTTP連接www.baidu.com,成功
HTTP連接www.sina.com.cn,失敗
HTTPS連接www.sina.com.cn,成功
期末複習,順便寫博客記錄下來,這篇為上篇,介紹HTTP網頁請求下載,主要是HTTP(s)協議的網絡編程,包括使用TCP Socket進行三次握手的HTTP網頁下載,和使用SSL Socket的安全傳輸的HTTPs網頁下載,通過案例實踐自行完成編程,認識http(s)的實際工作機制!
期待:Java之HTTP網絡編程(下篇:網頁瀏覽器程序設計),將看到網頁的HTML源代碼,以及經過瀏覽器功能渲染之後的網頁!
如果覺得不錯歡迎「一鍵三連」哦,點贊收藏關注,有問題直接評論,交流學習!
我的博客園://www.cnblogs.com/chenzhenhong/p/14435762.html
我的CSDN博客://blog.csdn.net/Charzous/article/details/111470556