go如何使web工作

2021-10-25 15:24:35 字數 1827 閱讀 7563

以下均是伺服器端的幾個概念

request:使用者請求的資訊,用來解析使用者的請求資訊,包括post、get、cookie、url等資訊

response:伺服器需要反饋給客戶端的資訊

handler:處理請求和生成返回資訊的處理邏輯

建立listen socket, 監聽指定的埠, 等待客戶端請求到來。

listen socket接受客戶端的請求, 得到client socket, 接下來通過client socket與客戶端通訊。

處理客戶端的請求, 首先從client socket讀取http請求的協議頭, 如果是post方法, 還可能要讀取客戶端提交的資料, 然後交給相應的handler處理請求, handler處理完畢準備好客戶端需要的資料, 通過client socket寫給客戶端。

這整個的過程裡面我們只要了解清楚下面三個問題,也就知道go是如何讓web執行起來了

前面小節的**裡面我們可以看到,go是通過乙個函式listenandserve來處理這些事情的,這個底層其實這樣處理的:初始化乙個server物件,然後呼叫了net.listen("tcp", addr),也就是底層用tcp協議搭建了乙個服務,然後監控我們設定的埠。

下面**來自go的http包的原始碼,通過下面的**我們可以看到整個的http處理過程:

}}監控之後如何接收客戶端的請求呢?上面**執行監控埠之後,呼叫了srv.serve(net.listener)函式,這個函式就是處理接收客戶端的請求資訊。這個函式裡面起了乙個for{},首先通過listener接收請求,其次建立乙個conn,最後單獨開了乙個goroutine,把這個請求的資料當做引數扔給這個conn去服務:go c.serve()。這個就是高併發體現了,使用者的每一次請求都是在乙個新的goroutine去服務,相互不影響。

那麼如何具體分配到相應的函式來處理請求呢?conn首先會解析request:c.readrequest(),然後獲取相應的handler:handler := c.server.handler,也就是我們剛才在呼叫函式listenandserve時候的第二個引數,我們前面例子傳遞的是nil,也就是為空,那麼預設獲取handler = defaultservemux,那麼這個變數用來做什麼的呢?對,這個變數就是乙個路由器,它用來匹配url跳轉到其相應的handle函式,那麼這個我們有設定過嗎?有,我們呼叫的**裡面第一句不是呼叫了http.handlefunc("/", sayhelloname)嘛。這個作用就是註冊了請求/的路由規則,當請求uri為"/",路由就會轉到函式sayhelloname,defaultservemux會呼叫servehttp方法,這個方法內部其實就是呼叫sayhelloname本身,最後通過寫入response的資訊反饋到客戶端。

3 3 Go如何使得Web工作

前面小節介紹了如何通過go搭建乙個web服務,我們可以看到簡單應用乙個net http包就方便的搭建起來了。那麼go在底層到底是怎麼做的呢?萬變不離其宗,go的web服務工作也離不開我們第一小節介紹的web工作方式。以下均是伺服器端的幾個概念 request 使用者請求的資訊,用來解析使用者的請求資...

Web是如何工作的

網路是如何工作的提供在計算機或 上的web瀏覽器中檢視網頁時發生的情況的簡化檢視。這一理論對於在短期內編寫web 並不重要,但不久之後,您將真正開始從了解在後台發生的事情中獲益。客戶端和伺服器 連線到web的計算機稱為客戶和伺服器。它們的互動方式的簡化圖可能如下所示 現在,讓我們想象一下,網路是一條...

一 Web 如何工作的

平常我們在瀏覽器中輸入乙個 隨即看到乙個頁面,這個過程是怎樣實現的呢?下面用一幅圖來說明 整個流程如下 1 網域名稱解析 瀏覽器會解析網域名稱對應的ip位址 ps dns伺服器的知識 2 建立tcp連線 拿到網域名稱對應的ip位址之後,瀏覽器會向伺服器的web程式發起tcp的連線請求。這個連線請求到...