HTTP協(xié)議全稱超文本傳輸協(xié)議(HyperText Transfer Protocol)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議,它詳細(xì)規(guī)定了瀏覽器和WWW服務(wù)器之間通信的規(guī)則,通過Internet傳送WWW文檔的數(shù)據(jù)傳送協(xié)議。

創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比碑林網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式碑林網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋碑林地區(qū)。費(fèi)用合理售后完善,十余年實(shí)體公司更值得信賴。
Web服務(wù)是HTTP協(xié)議的一個服務(wù),HTTP協(xié)議承載在TCP協(xié)議之上。Web服務(wù)工作流程
基于HTTP構(gòu)建的服務(wù)標(biāo)準(zhǔn)模型包括客戶端和服務(wù)端,HTTP請求從客戶端發(fā)出,服務(wù)端接收到請求后進(jìn)行處理,然后將響應(yīng)返回給客戶端。
HTTP服務(wù)端核心工作是如何接收來自客戶端的請求,并向客戶端返回響應(yīng)。當(dāng)HTTP服務(wù)器接收到客戶端請求時,首先會進(jìn)入路由模塊,路由又稱為服務(wù)復(fù)用器(Multiplexer),路由的工作在于請求找到對應(yīng)的處理器(Handler),處理器對接收到的請求進(jìn)行對應(yīng)處理后,構(gòu)建響應(yīng)并返回給客戶端。
Go語言通過引入 net/http 包來實(shí)現(xiàn)HTTP網(wǎng)絡(luò)訪問,并提供HTTP客戶端和服務(wù)端的實(shí)現(xiàn)。
創(chuàng)建HTTP服務(wù)需經(jīng)過2個階段
例如:創(chuàng)建HTTP服務(wù)
理解HTTP服務(wù)關(guān)鍵點(diǎn)在于路由器和處理器
服務(wù)復(fù)用器
處理器
http.ServeMux 內(nèi)部使用一個 map 映射來保存所有處理器, http.muxEntry 是一個多路復(fù)用器入口實(shí)體。
可以發(fā)現(xiàn)在 http.muxEntry 字段中存在著 http.Handler 接口類型的 h
雖然 http.ServeMux 也實(shí)現(xiàn)了 http.ServerHTTP() 算得上是一個 http.Handler ,但 http.ServeMux 的 http.ServeHTTP() 并非用來處理請求和響應(yīng),而是用來查找注冊路由對應(yīng)的處理器。
當(dāng) http.ServeMux 路由器設(shè)置路由規(guī)則后,會通過它實(shí)現(xiàn)的 ServeHTTP() 完成請求的分發(fā)。當(dāng)路由器接收到請求后若請求的URI為 * 則會關(guān)閉連接,否則會調(diào)用自身的 Handler() 來獲取對應(yīng)路由的處理器,最終通過調(diào)用 h.ServeHTTP(w,r) 實(shí)現(xiàn)對應(yīng)路由的實(shí)現(xiàn)邏輯。
路由器會根據(jù)用戶請求的URL路徑去匹配自身存儲的在 map 中的 handler ,最終調(diào)用匹配到的 handler 的 ServeHTTP() 以實(shí)現(xiàn)執(zhí)行對應(yīng)路由的處理函數(shù)。
創(chuàng)建 http.ServeMux 實(shí)例的方式有兩種
http.DefaultServeMux 是默認(rèn)的 http.ServeMux ,會隨著 net/http 包初始化而被自動初始化。
當(dāng) http.ListenAndServe() 在沒有提供其他處理器的情況下,即它的入?yún)?handler 為 nil 時內(nèi)部會使用 http.DefaultServeMux 。
net/http 包提供了一組快捷的注冊路由的函數(shù) http.Handle() 、 http.HandleFunc() 來配置 http.DefaultServeMux ,快捷函數(shù)會將處理器注冊到 http.DefaultServeMux 。
二者之間的區(qū)別在于 handler 參數(shù)上
http.Handle() 的 handler 是一個 http.Handler 接口實(shí)例,也就是說傳入的 handler 必須要自己提前實(shí)現(xiàn) http.Handler 接口的 ServerHTTP(ResponseWriter, *Request) 方法。
例如:將處理器放入閉包中,將參數(shù)傳入處理器。
http.HandleFunc() 的 handler 直接是一個原型為 func(ResponseWriter, *Request) 的函數(shù),深入追蹤會 HandleFunc() 會發(fā)現(xiàn)一個自定義的函數(shù)類型。
因此任何具有 func(ResponseWriter, *Request) 簽名的函數(shù)都能轉(zhuǎn)換成為一個 http.HandlerFunc 類型的對象。同時自定義的函數(shù)類型中已經(jīng)實(shí)現(xiàn)了 ServeHTTP() 方法,因此它也是一個 http.Handler 。
例如:返回時使用一個到 http.HandlerFunc 類型的隱式轉(zhuǎn)換
net/http 包提供了 http.NewServeMux() 來創(chuàng)建一個自定義的 http.ServeMux 實(shí)例
例如:調(diào)用 http.NewServeMux() 會創(chuàng)建服務(wù)復(fù)用器
例如:創(chuàng)建靜態(tài)服務(wù)
Go中沒有繼承、多態(tài),可通過接口來實(shí)現(xiàn)。而接口則是定義聲明的函數(shù)簽名,任何結(jié)構(gòu)體只要實(shí)現(xiàn)與接口函數(shù)簽名相同的方法,即等同于實(shí)現(xiàn)了對應(yīng)的接口。
例如: http.HandleFunc() 處理函數(shù)實(shí)現(xiàn)實(shí)際上調(diào)用默認(rèn) http.DefaultServeMux 的 HandleFunc() 方法
例如:調(diào)用 http.Handle() 方法則第二個參數(shù) handle 必須實(shí)現(xiàn) http.Handler 接口的 ServeHTTP() 方法,也就是說只要具有 ServeHTTP() 簽名方法即可作為處理器。
例如:自定義處理器
http.HandlerFunc 自身已實(shí)現(xiàn) http.Handler 接口的 ServeHTTP() 方法,因此它也是一個處理器。
http.HandlerFunc 的作用是將自定義函數(shù)轉(zhuǎn)換為 http.Handler 處理器類型,當(dāng)調(diào)用 http.HandlerFunc(fn) 后會強(qiáng)制將 fn 函數(shù)類型轉(zhuǎn)換為 http.HandlerFunc 類型,這樣 fn 函數(shù)就具有了 ServeHTTP() 方法,同時也就轉(zhuǎn)換成為了一個 http.Handler 處理器。因此 http.HandlerFunc 又稱為適配器。
80端口是為HTTP(HyperText Transport Protocol,超文本傳輸協(xié)議)開放的,主要用于在WWW(World Wide Web,萬維網(wǎng))服務(wù)上傳輸信息的協(xié)議,用IE訪問一般的網(wǎng)站都是通過這個端口,所以如果要訪問網(wǎng)站,必須開啟這個端口!
如果想關(guān)閉,可以到本地連接-》“屬性”-》“TCP/IP協(xié)議“-》“屬性”-》“高級”-》“選項(xiàng)”-》“TCP/IP篩選”-》“屬性”-》把TCP端口中選擇為只允許一些端口,然后把常用的TCP端口填進(jìn)去,不填80端口就關(guān)閉了,常用端口請查相關(guān)資料!
建議用防火墻或殺毒軟件監(jiān)聽80端口,可以保護(hù)80端口安全!
這樣就完成了http連接的3次握手操作。
我們可以通過wireShark抓包工具來獲取http三次握手的整個過程
首先打開WireShark,選擇 Loopback 過濾條件
我們看下http斷開時的四次揮手的整個過程
我們關(guān)閉其中一個終端即可斷開http連接,利用WireShark來抓取整個過程
個人理解,在進(jìn)行http連接時,客戶端首先向服務(wù)器端發(fā)送連接的通信,然后服務(wù)器立即同意了對方通信的要求,因?yàn)榇藭r還沒有連接,服務(wù)器端沒有未處理完的事務(wù),可以即刻向?qū)Ψ桨l(fā)出通信的請求,最后等待客戶端的同意。在http斷開時,客戶端向服務(wù)器端發(fā)出close請求,然后,服務(wù)器端同意客戶端發(fā)出的close請求,因?yàn)榉?wù)器端可能還沒處理完 移動端上次請求的事務(wù),不能立即發(fā)出close請求,需要等到處理完成后再向客戶端發(fā)出close請求。再服務(wù)器器處理完之后,向移動端發(fā)出close請求,最后移動端同意服務(wù)器端發(fā)出的close請求。
分享文章:關(guān)于go語言關(guān)閉http連接的信息
文章來源:http://www.chinadenli.net/article8/dddjsop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計、電子商務(wù)、定制網(wǎng)站、虛擬主機(jī)、、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)