網路通訊6:搭建HTTP伺服器
#1、Web工作方式
我們平時瀏覽網頁的時候,會開啟瀏覽器,輸入網址後按下Enter鍵,然後就會顯示出你想要 瀏覽的內容。在這個看似簡單的使用者行為背後,到底隱藏了些什麼呢?
對於普通的上網過程,系統其實是這樣做的:瀏覽器本身是一個客戶端,當你輸入URL的 時候,首先瀏覽器會去請求DNS伺服器,通過DNS獲取相應的域名對應的IP,然後通過 IP地址找到IP對應的伺服器後,要求建立TCP連線,等瀏覽器傳送完HTTP Request (請求)包後,伺服器接收到請求包之後才開始處理請求包,伺服器呼叫自身服務,返回 HTTP Response(響應)包;客戶端收到來自伺服器的響應後開始渲染這個Response包 裡的主體(body),等收到全部的內容隨後斷開與該伺服器之間的TCP連線。
Web伺服器的工作原理可以簡單地歸納為:
- 客戶機通過TCP/IP協議建立到伺服器的TCP連線
- 客戶端向伺服器傳送HTTP協議請求包,請求伺服器裡的資源文件
- 伺服器向客戶機傳送HTTP協議應答包,如果請求的資源包含有動態語言的內容,那麼伺服器會呼叫動態語言的解釋引擎負責處理“動態內容”,並將處理得到的資料返回給客戶端
- 客戶機與伺服器斷開。由客戶端解釋HTML文件,在客戶端螢幕上渲染圖形結果
#2.Go如何使得Web工作
前面小節介紹瞭如何通過Go搭建一個Web服務,我們可以看到簡單應用一個net/http包 就方便的搭建起來了。那麼Go在底層到底是怎麼做的呢?
###web工作方式的幾個概念
- Request:使用者請求的資訊,用來解析使用者的請求資訊,包括post、get、cookie、url等資訊
- Response:伺服器需要反饋給客戶端的資訊
- Conn:使用者的每次請求連結
- Handler:處理請求和生成返回資訊的處理邏輯
###分析 http包執行機制
如下圖所示,是Go實現Web服務的工作模式的流程圖
- 建立Listen Socket, 監聽指定的埠, 等待客戶端請求到來。
- Listen Socket接受客戶端的請求, 得到Client Socket, 接下來通過Client Socket與 客戶端通訊。
- 處理客戶端的請求, 首先從Client Socket讀取HTTP請求的協議頭, 如果是POST 方法, 還可能要讀取客戶端提交的資料,然後交給相應的handler處理請求, handler處理完 畢準備好客戶端需要的資料, 通過Client Socket寫給客戶端。
#例項
###匯入依賴包
import (
"net/http"
"io/ioutil"
_"net/http/pprof"
)
###定義路由處理,並監聽在指定埠
func main() {
//定義對/hello路由的響應
http.HandleFunc(
"/hello",
func(responseWriter http.ResponseWriter, request *http.Request) {
//向響應中寫入客戶端地址
responseWriter.Write([]byte(request.RemoteAddr+";"))
//向響應中寫入客戶端方法
responseWriter.Write([]byte(request.Method))
//向響應中寫入內容
responseWriter.Write([]byte("hello 祥哥 hello go"))
})
//定義對/sister路由的響應
http.HandleFunc(
"/sister",
func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("你妹"))
})
//定義對/fuck路由的響應
http.HandleFunc("/fuck", func(writer http.ResponseWriter, request *http.Request) {
//從本地html檔案中讀入HTML頁面的原始位元組
contentBytes, _ := ioutil.ReadFile("/home/sirouyang/Desktop/demos/W3/day5/02HTTP/fuck.html")
//向客戶端寫出響應
writer.Write(contentBytes)
})
//開啟伺服器並監聽在8080埠
http.ListenAndServe("127.0.0.1:8080", nil)
}
學院Go語言視訊主頁
https://edu.csdn.net/lecturer/1928
[清華團隊帶你實戰區塊鏈開發]
(https://ke.qq.com/course/344443?tuin=3d17195d)
掃碼獲取海量視訊及原始碼 QQ群:721929980
相關文章
- 網路通訊5:HTTP下載器HTTP
- SocketServer ——網路通訊伺服器Server伺服器
- 網路通訊3:HTTP實現文字傳輸HTTP
- 網路通訊協議-HTTP協議詳解!協議HTTP
- 網路通訊
- 網路通訊5:執行HTTP的GET/POST請求HTTP
- HTTP通訊HTTP
- Socket搭建即時通訊伺服器伺服器
- udp網路通訊UDP
- 網路通訊4:HTTP實現二進位制傳輸HTTP
- 網路通訊協議自動轉換之thrift到http協議HTTP
- 網路通訊2:TCP通訊實現TCP
- 網路通訊3:TCP互動通訊TCP
- 網路通訊2:TCP簡單通訊TCP
- 網路通訊——socket(TCP/IP).Http,同步和非同步的區別TCPHTTP非同步
- dubbo網路通訊(四)
- 網路通訊1:UDPUDP
- 19作 網路通訊
- 網路通訊協議協議
- 網路通訊基礎
- 企業資訊與網路通訊安全(6)財務分析 (轉)
- C++用libcurl庫進行http網路通訊程式設計C++HTTP程式設計
- HTTP通訊協議HTTP協議
- docker系列(五):網路通訊Docker
- 網路通訊程式設計程式設計
- BZOJ3651 : 網路通訊
- Java網路通訊套接字Java
- Mqtt搭建代理伺服器進行通訊-淺析MQQT伺服器
- Calico 網路通訊原理揭祕
- WebRTC---網路實時通訊Web
- 網路通訊4:TCP廣播TCP
- 網路通訊技術基礎
- 快速理解網路通訊協議協議
- 網路通訊單元NU系列
- 網路-淺談批次通訊和自主通訊的區別
- 通過Geth搭建私有以太坊網路
- iOS專案開發實戰——通過Http Get方式與伺服器通訊iOSHTTP伺服器
- iOS專案開發實戰——通過Http Post方式與伺服器通訊iOSHTTP伺服器