




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第7章Go網(wǎng)絡(luò)編程Socket編程01Socket概述Socket概述Socket是用于在計算機網(wǎng)絡(luò)中兩個應(yīng)用進程間發(fā)送和接收數(shù)據(jù)的端點,其中包含通信協(xié)議、目標地址、連接狀態(tài)等,作為一種網(wǎng)絡(luò)資源,它本質(zhì)上就是對傳輸層協(xié)議(TCP/UDP)的運用進行了一層封裝,讓應(yīng)用程序能夠更方便地使用傳輸層來傳輸數(shù)據(jù)。主流操作系統(tǒng)(Windows/Linux/MacOS等)都提供了統(tǒng)一的套接字抽象編程接口(SocketAPI),開發(fā)人員平時編寫的網(wǎng)絡(luò)程序大多處于應(yīng)用層,它們直接調(diào)用SocketAPI接口進行通信,故Socket在網(wǎng)絡(luò)中所處的位置大致位于應(yīng)用層的底部、傳輸層之上(如圖所示),起到連接這兩層的關(guān)鍵作用。02TCP程序設(shè)計1.TCP原理2.TCP編程TCP程序設(shè)計1.TCP原理一個典型的TCP傳輸文件的過程如下:(1)首先啟動服務(wù)器,一段時間后啟動客戶端,它與此服務(wù)器經(jīng)過三次握手后建立連接。(2)此后的一段時間內(nèi),客戶端向服務(wù)器發(fā)送一個請求,服務(wù)器處理這個請求,并為客戶端發(fā)回一個響應(yīng)。這個過程一直持續(xù)下去,直到客戶端向服務(wù)器發(fā)一個文件結(jié)束符,并關(guān)閉客戶端連接。(3)接著服務(wù)器也關(guān)閉服務(wù)器端的連接,結(jié)束運行或等待一個新的客戶端連接。以上TCP客戶端與TCP服務(wù)器間的交互時序如圖。TCP程序設(shè)計2.TCP編程Go語言TCP編程的通行步驟如下。(1)封裝地址用net.ResolveTCPAddr方法封裝TCP地址,形式為:地址,錯誤:=net.ResolveTCPAddr("tcp","主機:端口")返回的“地址”是一個TCPAddr類型的指針。(2)監(jiān)聽地址服務(wù)器通過net.ListenTCP方法監(jiān)聽第(1)步封裝的TCP地址,等待客戶端的請求,語句形式為:監(jiān)聽器,錯誤:=net.ListenTCP("tcp",地址)這里創(chuàng)建的監(jiān)聽器是*TCPListener類型。(3)發(fā)起連接客戶端通過net.DialTCP方法向服務(wù)器監(jiān)聽的地址發(fā)起連接請求,如下:連接,錯誤:=net.DialTCP("tcp",nil,地址)返回的“連接”是TCPConn類型的指針。TCP程序設(shè)計(4)接受連接服務(wù)器在循環(huán)中用監(jiān)聽器的AcceptTCP方法隨時接受到來的連接請求:連接,錯誤:=監(jiān)聽器.AcceptTCP()這里的“連接”是由監(jiān)聽器創(chuàng)建的用于與客戶端Socket連接的結(jié)構(gòu)體,類型也是TCPConn的指針。(5)傳輸數(shù)據(jù)接下來的數(shù)據(jù)傳輸就在雙方連接(TCPConn類型的結(jié)構(gòu)體)對象之間進行,用Read方法接收數(shù)據(jù),Write方法發(fā)送數(shù)據(jù),形如:長度,錯誤:=連接.Read(數(shù)據(jù)) //接收數(shù)據(jù)長度,錯誤:=連接.Write(數(shù)據(jù)) //發(fā)送數(shù)據(jù)收發(fā)的數(shù)據(jù)都是字節(jié)切片([]byte)類型。TCP程序設(shè)計【實例7.1】用TCP實現(xiàn)客戶端向服務(wù)器上傳文本文件。開發(fā)步驟如下。(1)實現(xiàn)思路及準備客戶端首先將要上傳的文件名發(fā)給服務(wù)器,服務(wù)器在自己的資源目錄下創(chuàng)建此名稱的文本文件;然后客戶端將文件內(nèi)容讀取出來發(fā)送到服務(wù)器端,服務(wù)器程序再將傳來的內(nèi)容寫入文件即可。本例以D:\Go\下載Go學(xué)習(xí)資源\2023\08\01下面的“Go語言.txt”文件做測試,服務(wù)器資源目錄為D:\res\files,需要事先創(chuàng)建好。(2)服務(wù)器端開發(fā)編寫服務(wù)器程序代碼如下(file-server.go):(3)客戶端開發(fā)編寫客戶端程序代碼如下(file-client.go):TCP程序設(shè)計(4)運行程序先啟動服務(wù)器程序再啟動客戶端,在客戶端子窗口提示符處輸入文件名“Go語言”回車,運行結(jié)果如圖。此時進入到D:\res\files目錄下可看到上傳的文件“Go語言.txt”。服務(wù)器輸出客戶端輸出03UDP程序設(shè)計1.UDP原理2.UDP編程UDP程序設(shè)計1.UDP原理UDP(UserDatagramProtocol,用戶數(shù)據(jù)報協(xié)議)是一種簡單、輕量、無連接的傳輸協(xié)議,可以用在對通信可靠性要求不是很高的場合,如以下幾種情形:網(wǎng)絡(luò)數(shù)據(jù)大多為短消息。系統(tǒng)擁有大量客戶端。對數(shù)據(jù)安全性無特殊要求。網(wǎng)絡(luò)負載很重,但對響應(yīng)速度卻要求極高。UDP所收發(fā)數(shù)據(jù)的形式是報文(Datagram),通信時UDP客戶端向UDP服務(wù)器發(fā)送一定長度的請求報文,報文大小的限制與各系統(tǒng)的協(xié)議實現(xiàn)有關(guān),但不得超過其下層IP規(guī)定的64KB,UDP服務(wù)器同樣以報文做出應(yīng)答,如圖。UDP程序設(shè)計在UDP方式下,客戶端并不與服務(wù)器建立連接,它只負責(zé)調(diào)用發(fā)送函數(shù)向服務(wù)器發(fā)出數(shù)據(jù)報。類似地,服務(wù)器也不接受客戶端的連接,只是調(diào)用接收函數(shù)被動等待來自某客戶端的數(shù)據(jù)到達。UDP客戶端與UDP服務(wù)器間的交互時序如圖。UDP程序設(shè)計UDP與TCP的比較見表。比較項UDPTCP是否連接無連接面向連接傳輸可靠性不可靠可靠流量控制不提供提供工作方式可以是全雙工全雙工應(yīng)用場合少量數(shù)據(jù)大量數(shù)據(jù)速度快慢UDP程序設(shè)計2.UDP編程Go語言UDP編程的通行步驟如下。(1)封裝地址用net.ResolveUDPAddr方法封裝UDP地址,形式為:地址,錯誤:=net.ResolveUDPAddr("udp","主機:端口")返回的“地址”是一個UDPAddr類型的指針。(2)監(jiān)聽地址服務(wù)器通過net.ListenUDP方法監(jiān)聽第(1)步封裝的UDP地址,語句為:監(jiān)聽器,錯誤:=net.ListenUDP("udp",地址)(3)建立連接客戶端通過net.DialUDP方法與服務(wù)器的監(jiān)聽器建立連接,如下:連接,錯誤:=net.DialUDP("udp",nil,地址)返回的“連接”也是UDPConn類型的指針,它無須經(jīng)服務(wù)器接受,直接就能與服務(wù)器端的監(jiān)聽器通信。UDP程序設(shè)計(4)收發(fā)數(shù)據(jù)UDP數(shù)據(jù)的收發(fā)在服務(wù)器端監(jiān)聽器與客戶端連接(兩者同為UDPConn類型的結(jié)構(gòu)體)之間進行,用ReadFromUDP方法接收數(shù)據(jù),WriteToUDP方法發(fā)送數(shù)據(jù),形如:長度,地址,錯誤:=連接.ReadFromUDP(數(shù)據(jù)) //接收數(shù)據(jù)連接.WriteToUDP(數(shù)據(jù),地址) //發(fā)送數(shù)據(jù)UDP收發(fā)的數(shù)據(jù)也都是字節(jié)切片([]byte)類型?!緦嵗?.2】用UDP模擬即時通訊軟件(如微信、QQ等)的用戶加入群聊時與服務(wù)器的交互。開發(fā)步驟如下。(1)服務(wù)器端開發(fā)編寫服務(wù)器程序代碼如下(group-server.go):(2)客戶端開發(fā)編寫客戶端程序代碼如下(group-client.go):UDP程序設(shè)計(3)運行程序先啟動服務(wù)器程序再啟動客戶端,在客戶端子窗口提示符處輸入用戶名“周何駿”回車,運行結(jié)果如圖。服務(wù)器輸出客戶端輸出第7章Go網(wǎng)絡(luò)編程HTTP編程01最簡單的HTTP程序最簡單的HTTP程序Go語言有net/http包專用于實現(xiàn)HTTP功能,一個最簡單的HTTP程序由服務(wù)器和客戶端兩部分組成,客戶端向服務(wù)器上的復(fù)用器發(fā)出HTTP請求,復(fù)用器根據(jù)請求的URL找到預(yù)先注冊的對應(yīng)處理器,將請求交給處理器處理,處理器執(zhí)行程序邏輯得到結(jié)果,再將結(jié)果寫入HTTP響應(yīng)體后返回給客戶端,整個過程如圖。最簡單的HTTP程序這個過程的Go語言實現(xiàn)方式如下。(1)服務(wù)器服務(wù)器端需要編寫實現(xiàn)一個處理器函數(shù),將這個函數(shù)注冊到復(fù)用器中,然后在指定服務(wù)地址上開啟監(jiān)聽,等待客戶端請求的到來。①實現(xiàn)處理器實現(xiàn)處理器就是編寫相應(yīng)的處理器函數(shù),處理器函數(shù)有固定類型的兩個參數(shù),寫法為:func函數(shù)名(參數(shù)1http.ResponseWriter,參數(shù)2*http.Request){ ...//執(zhí)行處理邏輯的代碼}②注冊處理器用戶編寫的處理器必須注冊才能使用,net/http包提供一個HandleFunc函數(shù)用于在指定的URL路徑上注冊處理器,語句寫法為:http.HandleFunc(URL路徑,函數(shù)名)最簡單的HTTP程序③開啟監(jiān)聽一切準備就緒后,服務(wù)器調(diào)用ListenAndServe函數(shù)開啟監(jiān)聽,就可以向客戶端提供服務(wù)了,語句如下:http.ListenAndServe(地址,nil)如果需要對服務(wù)器進行更多配置,可先創(chuàng)建一個http.Server結(jié)構(gòu)體對象,指定對其特定的參數(shù)進行初始化,然后再調(diào)用ListenAndServe函數(shù),代碼形如://配置服務(wù)器server:=&http.Server{
參數(shù)1:值1,
參數(shù)2:值2, ...
參數(shù)n:值n,}server.ListenAndServe() //開啟監(jiān)聽最簡單的HTTP程序(2)客戶端客戶端需要能創(chuàng)建HTTP請求和解析HTTP響應(yīng)。①創(chuàng)建HTTP請求Go使用NewRequest函數(shù)創(chuàng)建HTTP請求,語句為:請求,錯誤:=http.NewRequest(方法,URL,請求體)②解析HTTP響應(yīng)net/http包中提供了一個模擬客戶端的Client結(jié)構(gòu)體,通過調(diào)用其Do方法來獲取一個HTTP請求對應(yīng)的響應(yīng),語句如下:客戶端:=&http.Client{}響應(yīng),錯誤:=客戶端.Do(請求)Go對最常用的GET和POST請求還做了進一步封裝,因此也可以不用模擬客戶端而直接通過Get或Post函數(shù)獲取到響應(yīng),例如:響應(yīng),錯誤:=http.Get(URL)最簡單的HTTP程序【實例7.3】服務(wù)器在收到請求后向客戶端返回一句話:
“Hello,我愛Go語言!@easybooks”。開發(fā)步驟如下。(1)服務(wù)器編寫服務(wù)器程序代碼如下(hello-server.go):packagemainimport( "fmt" "net/http" //Go語言HTTP編程包)//實現(xiàn)處理器funcsayhello(whttp.ResponseWriter,req*http.Request){ fmt.Fprintf(w,"Hello,我愛Go語言!@easybooks\n") //w.Write([]byte("Hello,我愛Go語言!@easybooks\n")) //也可以用這句}
funcmain(){ http.HandleFunc("/hello",sayhello) //注冊處理器 http.ListenAndServe(":8080",nil) //開啟監(jiān)聽 //或者用下面這段代碼 //server:=&http.Server{ // Addr:":8080", //配置地址參數(shù) //} //server.ListenAndServe()}最簡單的HTTP程序(2)客戶端編寫客戶端程序代碼如下(hello-client.go):packagemainimport( "fmt" "io/ioutil" "net/http" //Go語言HTTP編程包)
funcmain(){ //創(chuàng)建HTTP請求 req,_:=http.NewRequest("GET",":8080/hello",nil) //解析HTTP響應(yīng) client:=&http.Client{} rsp,_:=client.Do(req)
//rsp,_:=http.Get(":8080/hello") //或者用這句替代上面3句 //輸出顯示響應(yīng)體中的數(shù)據(jù)內(nèi)容 contents,_:=ioutil.ReadAll(rsp.Body) fmt.Println(string(contents))}最簡單的HTTP程序(3)運行程序先啟動服務(wù)器程序再啟動客戶端,從客戶端子窗口中可看到輸出,或者通過瀏覽器訪問:8080/hello也能看到同樣的輸出內(nèi)容,運行結(jié)果如圖??蛻舳溯敵鰹g覽器輸出02使用模板引擎使用模板引擎網(wǎng)頁本質(zhì)上是一個HTML文檔,其中大部分內(nèi)容(如框架、樣式、主題、頁尾聲明等)都是固定不變的,變化的只是業(yè)務(wù)數(shù)據(jù),于是可將不變的部分提取出來作為“模板”,而可變部分則由處理器在運行時提供數(shù)據(jù),借助模板引擎渲染來合成動態(tài)網(wǎng)頁,如圖所示。使用模板引擎Go語言內(nèi)置了文本模板引擎text/template包,開發(fā)使用模板引擎的HTTP程序的通行步驟如下。(1)定義模板模板文件通常是.html網(wǎng)頁文件,也可以是.tmpl或.tpl后綴的文件,但都必須使用UTF-8編碼。用戶要按一定的語法規(guī)則編寫模板內(nèi)容,基本規(guī)則如下:模板中使用“{{”和“}}”來包裹和標識需要傳入的數(shù)據(jù)。傳給模板的數(shù)據(jù)可以通過點號(.)來訪問。如果是復(fù)合類型的數(shù)據(jù),則可以通過“{{.字段名}}”來訪問它的字段。除“{{”和“}}”包裹的內(nèi)容外,其他內(nèi)容均不做修改原樣輸出。使用模板引擎(2)解析模板解析模板使用ParseFiles函數(shù),該函數(shù)接收模板文件名作為參數(shù),返回一個模板對象(Template)類型的指針,調(diào)用語句如下:模板對象,錯誤:=template.ParseFiles(模板文件)(3)渲染模板最后,通過調(diào)用模板對象的Execute方法來渲染模板,語句如下:模板對象.Execute(HTTP響應(yīng)體,數(shù)據(jù))使用模板引擎【實例7.4】使用模板引擎在瀏覽器中輸出一句話:
“Hello,我愛Go語言!@easybooks”。開發(fā)步驟如下。(1)定義模板在當(dāng)前GoLand項目目錄下創(chuàng)建模板文件,編寫內(nèi)容如下(hello-view.html):<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>我喜愛的編程語言</title><style>.myfont{font-family:"華文楷體";font-size:x-large;font-weight:bold;color:limegreen;}</style></head><body><divclass="myfont">Hello,我愛{{.Language}}語言!@{{.User}}</div></body></html>使用模板引擎(2)解析、渲染模板解析和渲染模板的代碼都寫在服務(wù)器的處理器函數(shù)中,如下(hello-template.go):packagemainimport( "net/http" "text/template" //Go語言模板引擎包)typeContentsstruct{ //存儲數(shù)據(jù)的結(jié)構(gòu)體 Languagestring Userstring}//處理器函數(shù)funcrenderhello(whttp.ResponseWriter,req*http.Request){ tmpl,_:=template.ParseFiles("./hello-view.html") //解析模板 contents:=Contents{ Language:"Go", User:"easybooks", } //產(chǎn)生數(shù)據(jù)內(nèi)容 tmpl.Execute(w,contents) //渲染模板}
funcmain(){ http.HandleFunc("/hello",renderhello) http.ListenAndServe(":8080",nil)}使用模板引擎(3)運行程序啟動服務(wù)器,通過瀏覽器訪問:8080/hello,運行結(jié)果如圖。瀏覽器輸出客戶端輸出03請求多路復(fù)用請求多路復(fù)用多路復(fù)用的HTTP程序工作過程如圖。請求多路復(fù)用【實例7.5】使用多路復(fù)用器分別以中英文輸出對Go語言的問候。編寫服務(wù)器程序代碼如下(hello-handle.go):packagemainimport( "fmt" "net/http")typeContentsstruct{ //作為處理器類的結(jié)構(gòu)體 Languagestring Userstring}//處理器的ServeHTTP方法func(cContents)ServeHTTP(whttp.ResponseWriter,req*http.Request){ fmt.Fprintf(w,c.Language)}
funcmain(){ mux:=http.NewServeMux() //創(chuàng)建多路復(fù)用器 mux.Handle("/hello/cn",Contents{Language:"您好,我愛Go語言!@易斯\n"}) mux.Handle("/hello/en",Contents{Language:"Hello,IloveGolanguage!@easybooks\n"}) //不同的URL分別定向至不同的處理器實例 server:=&http.Server{ Addr:":8080", Handler:mux, //配置復(fù)用器 } server.ListenAndServe()}請求多路復(fù)用或者,也可以采用處理器函數(shù)的方式來實現(xiàn)多路復(fù)用功能,如下(hello-handlefunc.go):packagemainimport( "fmt" "net/http")
funccnHandler(whttp.ResponseWriter,req*http.Request){ fmt.Fprintf(w,"您好,我愛Go語言!@易斯\n")} //處理器函數(shù)1(輸出中文問候語)funcenHandler(whttp.ResponseWriter,req*http.Request){ fmt.Fprintf(w,"Hello,IloveGolanguage!@easybooks\n")} //處理器函數(shù)2(輸出英文問候語)
funcmain(){ mux:=http.NewServeMux() //創(chuàng)建多路復(fù)用器 //將兩個處理器函數(shù)注冊到復(fù)用器中 mux.HandleFunc("/hello/cn",cnHandler) mux.HandleFunc("/hello/en",enHandler) server:=&http.Server{ Addr:":8080", Handler:mux, //配置復(fù)用器 } server.ListenAndServe()}請求多路復(fù)用以上兩個程序的運行方式和結(jié)果都是完全一樣的。啟動服務(wù)器,通過瀏覽器訪問:8080/hello/cn,輸出中文問候語;訪問:8080/hello/en則輸出英文問候語,運行結(jié)果如圖。輸出中文問候語輸出英文問候語04表單提交處理表單提交處理在HTTP編程中,可從處理器函數(shù)的第2個參數(shù)(HTTP請求體)中獲取頁面表單提交的數(shù)據(jù),只要執(zhí)行語句:請求體.ParseForm()即可解析出表單數(shù)據(jù),數(shù)據(jù)是鍵值對的形式,可用如下語句得到對應(yīng)鍵的值:值:=請求體.Form.Get(鍵名)【實例7.6】在表單中輸入編程語言及用戶名,提交后用模板顯示對該語言的問候。開發(fā)步驟如下。(1)定義模板本例復(fù)用前面實例已定義好的模板hello-view.html,內(nèi)容略。表單提交處理(2)開發(fā)表單頁編寫表單頁的源碼如下(hello-submit.html):<html><head><title>我喜愛的編程語言</title></head><body><formaction="/hello"method="post">
語
言:<inputtype="text"name="language"><br>
用
戶:<inputtype="text"name="user"><br>
<inputtype="submit"value="確定"></form></body></html>表單提交處理(3)開發(fā)后臺程序編寫后臺服務(wù)器的程序代碼如下(hello-post.go):(4)運行程序啟動服務(wù)器,通過瀏覽器訪問:8080/hello,出現(xiàn)表單頁,在頁面表單中輸入語言和用戶,單擊“確定”按鈕提交,轉(zhuǎn)到模板頁輸出對該語言的問候,運行過程如圖。提交表單輸出問候第7章Go網(wǎng)絡(luò)編程Web開發(fā)基礎(chǔ)01Web程序架構(gòu)模式1.開發(fā)視圖2.開發(fā)模型和控制器3.運行程序Web程序架構(gòu)模式傳統(tǒng)網(wǎng)站的Web應(yīng)用程序普遍采用MVC架構(gòu)模式,它將軟件系統(tǒng)分為3個基本部分:模型:定義系統(tǒng)所用的數(shù)據(jù)結(jié)構(gòu)并封裝對數(shù)據(jù)的處理方法。它可訪問數(shù)據(jù)庫,有對數(shù)據(jù)直接操作的權(quán)限。視圖:實現(xiàn)Web前端界面,有目的地組織和顯示數(shù)據(jù)。它只關(guān)注數(shù)據(jù)的樣式和顯示效果而不管其內(nèi)容的正確性,也不包含處理數(shù)據(jù)的業(yè)務(wù)邏輯??刂破鳎河糜诳刂茟?yīng)用程序的流程、處理與程序業(yè)務(wù)邏輯相關(guān)的數(shù)據(jù)。它接受客戶端的請求、與模型和視圖交互并做出響應(yīng),在系統(tǒng)不同層面間起到組織協(xié)調(diào)作用。在Go語言開發(fā)的Web程序中,用于頁面顯示的模板和模板引擎就是視圖;復(fù)用器及其上注冊的諸多處理器一起構(gòu)成整個系統(tǒng)的控制器部分;而為了存儲數(shù)據(jù)內(nèi)容所定義的結(jié)構(gòu)體(類)及其操作數(shù)據(jù)的方法則是模型。Web程序架構(gòu)模式一個能完整體現(xiàn)MVC架構(gòu)的典型Go程序的組成結(jié)構(gòu)如圖。Web程序架構(gòu)模式【實例7.7】在MySQL數(shù)據(jù)庫中有一個favlang(愛好語言)表,其中存有一些用戶及各自所喜愛的編程語言名,如圖。Web程序架構(gòu)模式1.開發(fā)視圖(1)定義模板本例依然復(fù)用前面實例已定義好的模板hello-view.html,內(nèi)容略。(2)設(shè)計表單頁編寫表單頁的源碼如下(hello-query.html):<html><head><title>我喜愛的編程語言</title></head><body><formaction="/hello"method="post">
用
戶:<inputtype="text"name="user"><inputtype="submit"value="確定"></form></body></html>Web程序架構(gòu)模式2.開發(fā)模型和控制器本例的模型是一個名為FavLang的結(jié)構(gòu)體(對應(yīng)數(shù)據(jù)庫favlang表),它有一個getLang方法可獲取數(shù)據(jù)庫中給定用戶所喜愛的編程語言名;控制器是一個名為langController的處理器函數(shù)。模型和控制器部分的代碼都寫在后臺服務(wù)器程序中,如下(hello-mvc.go):3.運行程序啟動服務(wù)器,通過瀏覽器訪問:8080/hello,出現(xiàn)表單頁,在頁面表單中輸入用戶名,單擊“確定”按鈕提交,轉(zhuǎn)到模板頁輸出此用戶對該語言的問候,運行過程如圖。提交表單輸出問候02Gin框架1.安裝Gin框架2.開發(fā)視圖3.開發(fā)模型和路由引擎4.運行程序Gin框架(1)采用路由引擎實現(xiàn)C(控制器)功能路由引擎(gin.Engine)是Gin提供的一種中間件,乃是整個框架的核心,在用Gin框架編寫的程序一開始就要通過Default方法創(chuàng)建一個路由引擎的實例,它的作用相當(dāng)于Go語言HTTP程序中的復(fù)用器,可通過不同的請求方法將URL關(guān)聯(lián)到對應(yīng)的處理器函數(shù),語句如下:路由引擎=gin.Default()路由引擎.方法(URL路徑,函數(shù)名)這里的“方法”對應(yīng)GET、POST、PUT、DELETE等HTTP請求方法,“函數(shù)名”是需要由用戶自定義實現(xiàn)的處理器函數(shù)。然后,用Run方法啟動路由引擎,相當(dāng)于開啟ListenAndServe監(jiān)聽:路
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 氫能制備新方法-洞察及研究
- 多模態(tài)情感識別技術(shù):表情、語音與語言的綜合應(yīng)用綜述
- 基于雙層路徑規(guī)劃的智能導(dǎo)盲系統(tǒng)設(shè)計與實現(xiàn)
- 檢查督導(dǎo)整改管理辦法
- 藝術(shù)生產(chǎn)理論在當(dāng)代文藝創(chuàng)作中的實踐啟示研究
- 出具收入證明管理辦法
- 辦公樓保潔技術(shù)方案的研究與實踐
- 美學(xué)自學(xué)考試筆記重點解讀
- 游覽車運營調(diào)度方案設(shè)計
- 導(dǎo)電材料對厭氧消化性能的影響及其機制研究進展
- 新華書店讀者問卷調(diào)查表
- GB/T 20946-2007起重用短環(huán)鏈驗收總則
- GB/T 18391.3-2009信息技術(shù)元數(shù)據(jù)注冊系統(tǒng)(MDR)第3部分:注冊系統(tǒng)元模型與基本屬性
- GB/T 10610-2009產(chǎn)品幾何技術(shù)規(guī)范(GPS)表面結(jié)構(gòu)輪廓法評定表面結(jié)構(gòu)的規(guī)則和方法
- 熠搜家庭戶用光伏電站推介
- 濟源幼兒園等級及管理辦法
- 房地產(chǎn)開發(fā)全流程培訓(xùn)講義課件
- DB44-T 2163-2019山地自行車賽場服務(wù) 基本要求-(高清現(xiàn)行)
- 云南省特種設(shè)備檢驗檢測收費標準
- DB15T 933-2015 內(nèi)蒙古地區(qū)極端高溫、低溫和降雨標準
- 工傷責(zé)任保險單
評論
0/150
提交評論