真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

go語(yǔ)言http原理的簡(jiǎn)單介紹

http的共享怎么開(kāi)

這里我介紹兩種方法!

創(chuàng)新互聯(lián)建站是一家專注于網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì)與策劃設(shè)計(jì),若羌網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:若羌等地區(qū)。若羌做網(wǎng)站價(jià)格咨詢:18980820575

一 ?:用IIS或者Apache之類的web服務(wù)器軟件實(shí)現(xiàn)http文件共享

?這里我以IIS為例介紹下用常用的web服務(wù)器實(shí)現(xiàn)文件共享的方法,具體如下(以我機(jī)器為例):

? 1、打開(kāi)IIS,打開(kāi)“網(wǎng)站 -- 默認(rèn)網(wǎng)站”,右鍵點(diǎn)擊“屬性”,點(diǎn)擊“主目錄”,勾選“目錄瀏覽”選項(xiàng),如下圖所示:

??

2、進(jìn)入文件夾C:\Inetpub\wwwroot,拷貝文件“1.7z“到這個(gè)目錄:

? ?

3、打開(kāi)瀏覽器,輸入本機(jī)ip(比如我的:192.168.1.123),即可看到共享的文件并可以下載:

? ?

? ?點(diǎn)擊“1.7z”即可下載。

二 ?:用python或者go語(yǔ)言實(shí)現(xiàn)http文件共享

1、python實(shí)現(xiàn)http文件共享:

? 用過(guò)python的都知道python有一個(gè)很牛x的命令:

python?-m?SimpleHTTPServer

在C:\Python27下運(yùn)行命令:

?打開(kāi)瀏覽器,可以看到如下效果:

?這個(gè)命令的默認(rèn)端口是8000,如果我再加一個(gè)端口參數(shù),可以用其它端口進(jìn)行訪問(wèn),命令如下:

打開(kāi)瀏覽器:

? ??知道了這個(gè)原理,可以寫(xiě)個(gè)bat文件,在需要的時(shí)候copy到相應(yīng)的目錄雙擊即可,比如我的httpShare.bat文件如下:

? ? ?python -m SimpleHTTPServer 80

? ? ?默認(rèn)用80端口,訪問(wèn)時(shí)候只需要輸入我的ip地址即可。

2、go語(yǔ)言實(shí)現(xiàn)http文件共享:

上面的方法很方便,windows和linux通吃,不過(guò)前提是要安裝python

這里我有個(gè)用go語(yǔ)言實(shí)現(xiàn)的,也是windows和linux通吃(windows下不知道怎么配置的可以參考我之前的文章:,類似C/C++,是代碼可移植,使用前你只需編譯一次。

下面是示例代碼(httpShare.go):

package?main

import?(

"http"

"fmt"

)

func?main(){

h?:=?http.FileServer(http.Dir("."))

var?port?string

fmt.Printf("Please?input?port?Number:?")

fmt.Scanf("%s",port)

http.ListenAndServe(":"+port,?h)???

}

運(yùn)行效果:

http.ServeMux

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

Web服務(wù)是HTTP協(xié)議的一個(gè)服務(wù),HTTP協(xié)議承載在TCP協(xié)議之上。Web服務(wù)工作流程

基于HTTP構(gòu)建的服務(wù)標(biāo)準(zhǔn)模型包括客戶端和服務(wù)端,HTTP請(qǐng)求從客戶端發(fā)出,服務(wù)端接收到請(qǐng)求后進(jìn)行處理,然后將響應(yīng)返回給客戶端。

HTTP服務(wù)端核心工作是如何接收來(lái)自客戶端的請(qǐng)求,并向客戶端返回響應(yīng)。當(dāng)HTTP服務(wù)器接收到客戶端請(qǐng)求時(shí),首先會(huì)進(jìn)入路由模塊,路由又稱為服務(wù)復(fù)用器(Multiplexer),路由的工作在于請(qǐng)求找到對(duì)應(yīng)的處理器(Handler),處理器對(duì)接收到的請(qǐng)求進(jìn)行對(duì)應(yīng)處理后,構(gòu)建響應(yīng)并返回給客戶端。

Go語(yǔ)言通過(guò)引入 net/http 包來(lái)實(shí)現(xiàn)HTTP網(wǎng)絡(luò)訪問(wèn),并提供HTTP客戶端和服務(wù)端的實(shí)現(xiàn)。

創(chuàng)建HTTP服務(wù)需經(jīng)過(guò)2個(gè)階段

例如:創(chuàng)建HTTP服務(wù)

理解HTTP服務(wù)關(guān)鍵點(diǎn)在于路由器和處理器

服務(wù)復(fù)用器

處理器

http.ServeMux 內(nèi)部使用一個(gè) map 映射來(lái)保存所有處理器, http.muxEntry 是一個(gè)多路復(fù)用器入口實(shí)體。

可以發(fā)現(xiàn)在 http.muxEntry 字段中存在著 http.Handler 接口類型的 h

雖然 http.ServeMux 也實(shí)現(xiàn)了 http.ServerHTTP() 算得上是一個(gè) http.Handler ,但 http.ServeMux 的 http.ServeHTTP() 并非用來(lái)處理請(qǐng)求和響應(yīng),而是用來(lái)查找注冊(cè)路由對(duì)應(yīng)的處理器。

當(dāng) http.ServeMux 路由器設(shè)置路由規(guī)則后,會(huì)通過(guò)它實(shí)現(xiàn)的 ServeHTTP() 完成請(qǐng)求的分發(fā)。當(dāng)路由器接收到請(qǐng)求后若請(qǐng)求的URI為 * 則會(huì)關(guān)閉連接,否則會(huì)調(diào)用自身的 Handler() 來(lái)獲取對(duì)應(yīng)路由的處理器,最終通過(guò)調(diào)用 h.ServeHTTP(w,r) 實(shí)現(xiàn)對(duì)應(yīng)路由的實(shí)現(xiàn)邏輯。

路由器會(huì)根據(jù)用戶請(qǐng)求的URL路徑去匹配自身存儲(chǔ)的在 map 中的 handler ,最終調(diào)用匹配到的 handler 的 ServeHTTP() 以實(shí)現(xiàn)執(zhí)行對(duì)應(yīng)路由的處理函數(shù)。

創(chuàng)建 http.ServeMux 實(shí)例的方式有兩種

http.DefaultServeMux 是默認(rèn)的 http.ServeMux ,會(huì)隨著 net/http 包初始化而被自動(dòng)初始化。

當(dāng) http.ListenAndServe() 在沒(méi)有提供其他處理器的情況下,即它的入?yún)?handler 為 nil 時(shí)內(nèi)部會(huì)使用 http.DefaultServeMux 。

net/http 包提供了一組快捷的注冊(cè)路由的函數(shù) http.Handle() 、 http.HandleFunc() 來(lái)配置 http.DefaultServeMux ,快捷函數(shù)會(huì)將處理器注冊(cè)到 http.DefaultServeMux 。

二者之間的區(qū)別在于 handler 參數(shù)上

http.Handle() 的 handler 是一個(gè) http.Handler 接口實(shí)例,也就是說(shuō)傳入的 handler 必須要自己提前實(shí)現(xiàn) http.Handler 接口的 ServerHTTP(ResponseWriter, *Request) 方法。

例如:將處理器放入閉包中,將參數(shù)傳入處理器。

http.HandleFunc() 的 handler 直接是一個(gè)原型為 func(ResponseWriter, *Request) 的函數(shù),深入追蹤會(huì) HandleFunc() 會(huì)發(fā)現(xiàn)一個(gè)自定義的函數(shù)類型。

因此任何具有 func(ResponseWriter, *Request) 簽名的函數(shù)都能轉(zhuǎn)換成為一個(gè) http.HandlerFunc 類型的對(duì)象。同時(shí)自定義的函數(shù)類型中已經(jīng)實(shí)現(xiàn)了 ServeHTTP() 方法,因此它也是一個(gè) http.Handler 。

例如:返回時(shí)使用一個(gè)到 http.HandlerFunc 類型的隱式轉(zhuǎn)換

net/http 包提供了 http.NewServeMux() 來(lái)創(chuàng)建一個(gè)自定義的 http.ServeMux 實(shí)例

例如:調(diào)用 http.NewServeMux() 會(huì)創(chuàng)建服務(wù)復(fù)用器

例如:創(chuàng)建靜態(tài)服務(wù)

Go中沒(méi)有繼承、多態(tài),可通過(guò)接口來(lái)實(shí)現(xiàn)。而接口則是定義聲明的函數(shù)簽名,任何結(jié)構(gòu)體只要實(shí)現(xiàn)與接口函數(shù)簽名相同的方法,即等同于實(shí)現(xiàn)了對(duì)應(yīng)的接口。

例如: http.HandleFunc() 處理函數(shù)實(shí)現(xiàn)實(shí)際上調(diào)用默認(rèn) http.DefaultServeMux 的 HandleFunc() 方法

例如:調(diào)用 http.Handle() 方法則第二個(gè)參數(shù) handle 必須實(shí)現(xiàn) http.Handler 接口的 ServeHTTP() 方法,也就是說(shuō)只要具有 ServeHTTP() 簽名方法即可作為處理器。

例如:自定義處理器

http.HandlerFunc 自身已實(shí)現(xiàn) http.Handler 接口的 ServeHTTP() 方法,因此它也是一個(gè)處理器。

http.HandlerFunc 的作用是將自定義函數(shù)轉(zhuǎn)換為 http.Handler 處理器類型,當(dāng)調(diào)用 http.HandlerFunc(fn) 后會(huì)強(qiáng)制將 fn 函數(shù)類型轉(zhuǎn)換為 http.HandlerFunc 類型,這樣 fn 函數(shù)就具有了 ServeHTTP() 方法,同時(shí)也就轉(zhuǎn)換成為了一個(gè) http.Handler 處理器。因此 http.HandlerFunc 又稱為適配器。

go語(yǔ)言聊天室實(shí)現(xiàn)(六)創(chuàng)建HTTP連接,并升級(jí)為長(zhǎng)連接

我們?cè)趍ian函數(shù)中,首先初始化配置文件,然后新建http連接。

這個(gè)連接創(chuàng)建之后,監(jiān)聽(tīng)服務(wù)器的9999端口。如果url的路徑后綴為 "/ws",就轉(zhuǎn)發(fā)到ws/ws.go中的IndexHandler方法中。

這個(gè)方法中首先我們創(chuàng)建一個(gè)websocket的Upgrader實(shí)例,然后我們使用Upgrader的upgrade方法來(lái)升級(jí)一下我們的連接為長(zhǎng)連接。

升級(jí)完成之后會(huì)返回一個(gè)*websocket.Conn的連接,我們之后所有的關(guān)于連接的操作,都是基于該conn的。

在該連接完成之后,我們將連接存放到一個(gè)名為Client的map中,以便之后管理更為方便。

之后,我們啟動(dòng)一個(gè)goroutine來(lái)讀取連接中發(fā)送的信息內(nèi)容,再根據(jù)內(nèi)容進(jìn)行相應(yīng)的操作。

Go語(yǔ)言HTTPServer開(kāi)發(fā)的六種實(shí)現(xiàn)

學(xué)完了 net/http 和 fasthttp 兩個(gè)HTTP協(xié)議接口的客戶端實(shí)現(xiàn),接下來(lái)就要開(kāi)始Server的開(kāi)發(fā),不學(xué)不知道一學(xué)嚇一跳,居然這兩個(gè)庫(kù)還支持Server的開(kāi)發(fā),太方便了。

相比于Java的HTTPServer開(kāi)發(fā)基本上都是使用Spring或者Springboot框架,總是要配置各種配置類,各種 handle 對(duì)象。Golang的Server開(kāi)發(fā)顯得非常簡(jiǎn)單,就是因?yàn)樘貏e簡(jiǎn)單,或者說(shuō)沒(méi)有形成特別統(tǒng)一的規(guī)范或者框架,我發(fā)現(xiàn)了很多實(shí)現(xiàn)方式,HTTP協(xié)議基于還是 net/http 和 fasthttp ,但是 handle 語(yǔ)法就多種多樣了。

先復(fù)習(xí)一下: Golang語(yǔ)言HTTP客戶端實(shí)踐 、 Golang fasthttp實(shí)踐 。

在Golang語(yǔ)言方面,實(shí)現(xiàn)某個(gè)功能的庫(kù)可能會(huì)比較多,有機(jī)會(huì)還是要多跟同行交流,指不定就發(fā)現(xiàn)了更好用的庫(kù)。下面我分享我學(xué)到的六種Server開(kāi)發(fā)的實(shí)現(xiàn)Demo。

基于 net/http 實(shí)現(xiàn),這是一種比較基礎(chǔ)的,對(duì)于接口和 handle 映射關(guān)系處理并不優(yōu)雅,不推薦使用。

第二種也是基于 net/http ,這種編寫(xiě)語(yǔ)法可以很好地解決第一種的問(wèn)題,handle和path有了類似配置的語(yǔ)法,可讀性提高了很多。

第三個(gè)基于 net/http 和 github.com/labstack/echo ,后者主要提供了 Echo 對(duì)象用來(lái)處理各類配置包括接口和handle映射,功能很豐富,可讀性最佳。

第四種依然基于 net/http 實(shí)現(xiàn),引入了 github.com/gin-gonic/gin 的路由,看起來(lái)接口和 handle 映射關(guān)系比較明晰了。

第五種基于 fasthttp 開(kāi)發(fā),使用都是 fasthttp 提供的API,可讀性尚可,handle配置倒是更像Java了。

第六種依然基于 fasthttp ,用到了 github.com/buaazp/fasthttprouter ,有點(diǎn)奇怪兩個(gè)居然不在一個(gè)GitHub倉(cāng)庫(kù)里。使用語(yǔ)法跟第三種方式有點(diǎn)類似,比較有條理,有利于閱讀。


標(biāo)題名稱:go語(yǔ)言http原理的簡(jiǎn)單介紹
網(wǎng)頁(yè)網(wǎng)址:http://weahome.cn/article/dohpsis.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部