成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

包含用go語言實(shí)現(xiàn)通信協(xié)議的詞條

go語言--Goroutines

1、goroutine:在go語言中,每一個(gè)并發(fā)的執(zhí)行單元叫做goroutine,如果一個(gè)程序中包含多個(gè)goroutine,對(duì)兩個(gè)函數(shù)的調(diào)用則可能發(fā)生在同一時(shí)刻

創(chuàng)新互聯(lián)專注于網(wǎng)站建設(shè),為客戶提供做網(wǎng)站、成都網(wǎng)站制作、網(wǎng)頁設(shè)計(jì)開發(fā)服務(wù),多年建網(wǎng)站服務(wù)經(jīng)驗(yàn),各類網(wǎng)站都可以開發(fā),成都品牌網(wǎng)站建設(shè),公司官網(wǎng),公司展示網(wǎng)站,網(wǎng)站設(shè)計(jì),建網(wǎng)站費(fèi)用,建網(wǎng)站多少錢,價(jià)格優(yōu)惠,收費(fèi)合理。

2、main goroutine:當(dāng)一個(gè)程序啟動(dòng)時(shí),其主函數(shù)即在一個(gè)單獨(dú)的goroutine中運(yùn)行,我們叫他為main gorountine

3、go goroutine:新的goroutine會(huì)用go語句來創(chuàng)建,go+函數(shù)名,go語句會(huì)使其語句中的函數(shù)在一新創(chuàng)建的goroutine中運(yùn)行,而go語句本身會(huì)迅速地完成

4、goroutine的退出:主函數(shù)返回時(shí),所有的goroutine都會(huì)被直接打斷,程序退出,除了從主函數(shù)退出或者終止程序之外,沒有其他方法能夠讓一個(gè)goroutine來打斷另一個(gè)的執(zhí)行,但是可以通過另一種方式來實(shí)現(xiàn)這個(gè)目的,通過goroutine之間的通信來讓一個(gè)goroutine請(qǐng)求其他的goroutine,并讓請(qǐng)求的goroutine自行結(jié)束執(zhí)行

go語言版本的Gossip協(xié)議包(memberlist)的使用

由于工作的契機(jī),最近學(xué)習(xí)了下Gossip,以及go語言的實(shí)現(xiàn)版本HashiCorp/memberlist。網(wǎng)上有個(gè)最基本的memberlist使用的example,在下邊的鏈接中,感興趣可以按照文檔運(yùn)行下感受感受。本文主要講解memberlist v0.1.5 的使用細(xì)節(jié)。

Gossip是最終一致性協(xié)議,是目前性能最好,容錯(cuò)性最好的分布式協(xié)議。目前Prometheus的告警組件alertmanager、redis、s3、區(qū)塊鏈等項(xiàng)目都有使用Gossip。本文不介紹Gossip原理,大家自行谷歌。

簡(jiǎn)單的幾步即可搭建gossip集群

感謝已經(jīng)有網(wǎng)友為我們實(shí)現(xiàn)了一個(gè)example(

)。

哪里有問題,還請(qǐng)大家多多指正

Go 語言自我提升 (三次握手 - 四次揮手 - TCP狀態(tài)圖 - udp - 網(wǎng)絡(luò)文件傳輸)

三次握手:

1. 主動(dòng)發(fā)起連接請(qǐng)求端(客戶端),發(fā)送 SYN 標(biāo)志位,攜帶數(shù)據(jù)包、包號(hào)

2. 被動(dòng)接收連接請(qǐng)求端(服務(wù)器),接收 SYN,回復(fù) ACK,攜帶應(yīng)答序列號(hào)。同時(shí),發(fā)送SYN標(biāo)志位,攜帶數(shù)據(jù)包、包號(hào)

3. 主動(dòng)發(fā)起連接請(qǐng)求端(客戶端),接收SYN 標(biāo)志位,回復(fù) ACK。

被動(dòng)端(服務(wù)器)接收 ACK —— 標(biāo)志著 三次握手建立完成( Accept()/Dial() 返回 )

四次揮手:

1. 主動(dòng)請(qǐng)求斷開連接端(客戶端), 發(fā)送 FIN標(biāo)志,攜帶數(shù)據(jù)包

2. 被動(dòng)接受斷開連接端(服務(wù)器), 發(fā)送 ACK標(biāo)志,攜帶應(yīng)答序列號(hào)。 —— 半關(guān)閉完成。

3. 被動(dòng)接受斷開連接端(服務(wù)器), 發(fā)送 FIN標(biāo)志,攜帶數(shù)據(jù)包

4. 主動(dòng)請(qǐng)求斷開連接端(客戶端), 發(fā)送 最后一個(gè) ACK標(biāo)志,攜帶應(yīng)答序列號(hào)?!?發(fā)送完成,客戶端不會(huì)直接退出,等 2MSL時(shí)長(zhǎng)。

等 2MSL待目的:確保服務(wù)器 收到最后一個(gè)ACK

滑動(dòng)窗口:

通知對(duì)端本地存儲(chǔ)數(shù)據(jù)的 緩沖區(qū)容量?!?write 函數(shù)在對(duì)端 緩沖區(qū)滿時(shí),有可能阻塞。

TCP狀態(tài)轉(zhuǎn)換:

1. 主動(dòng)發(fā)起連接請(qǐng)求端:

CLOSED —— 發(fā)送SYN —— SYN_SENT(了解) —— 接收ACK、SYN,回發(fā) ACK —— ESTABLISHED (數(shù)據(jù)通信)

2. 主動(dòng)關(guān)閉連接請(qǐng)求端:

ESTABLISHED —— 發(fā)送FIN —— FIN_WAIT_1 —— 接收ACK —— FIN_WAIT_2 (半關(guān)閉、主動(dòng)端)

—— 接收FIN、回復(fù)ACK —— TIME_WAIT (主動(dòng)端) —— 等 2MSL 時(shí)長(zhǎng) —— CLOSED

3. 被動(dòng)建立連接請(qǐng)求端:

CLOSED —— LISTEN —— 接收SYN、發(fā)送ACK、SYN —— SYN_RCVD —— 接收 ACK —— ESTABLISHED (數(shù)據(jù)通信)

4. 被動(dòng)斷開連接請(qǐng)求端:

ESTABLISHED —— 接收 FIN、發(fā)送 ACK —— CLOSE_WAIT —— 發(fā)送 FIN —— LAST_ACK —— 接收ACK —— CLOSED

windows下查看TCP狀態(tài)轉(zhuǎn)換:

netstat -an | findstr? 端口號(hào)

Linux下查看TCP狀態(tài)轉(zhuǎn)換:

netstat -an | grep? 端口號(hào)

TCP和UDP對(duì)比:?

TCP: 面向連接的可靠的數(shù)據(jù)包傳遞。 針對(duì)不穩(wěn)定的 網(wǎng)絡(luò)層,完全彌補(bǔ)。ACK

UDP:無連接不可靠的報(bào)文傳輸。 針對(duì)不穩(wěn)定的 網(wǎng)絡(luò)層,完全不彌補(bǔ)。還原網(wǎng)絡(luò)真實(shí)狀態(tài)。

優(yōu)點(diǎn)???????????????????????????????????????????????????????????? 缺點(diǎn)

TCP: 可靠、順序、穩(wěn)定 ???????????????????????????????????? 系統(tǒng)資源消耗大,程序?qū)崿F(xiàn)繁復(fù)、速度慢

UDP:系統(tǒng)資源消耗小,程序?qū)崿F(xiàn)簡(jiǎn)單、速度快 ???????????????????????? 不可靠、無序、不穩(wěn)定

使用場(chǎng)景:

TCP:大文件、可靠數(shù)據(jù)傳輸。 對(duì)數(shù)據(jù)的 穩(wěn)定性、準(zhǔn)確性、一致性要求較高的場(chǎng)合。

UDP:應(yīng)用于對(duì)數(shù)據(jù)時(shí)效性要求較高的場(chǎng)合。 網(wǎng)絡(luò)直播、電話會(huì)議、視頻直播、網(wǎng)絡(luò)游戲。

UDP-CS-Server實(shí)現(xiàn)流程:

1.? 創(chuàng)建 udp地址結(jié)構(gòu) ResolveUDPAddr(“協(xié)議”, “IP:port”) —— udpAddr 本質(zhì) struct{IP、port}

2.? 創(chuàng)建用于 數(shù)據(jù)通信的 socket ListenUDP(“協(xié)議”, udpAddr ) —— udpConn (socket)

3.? 從客戶端讀取數(shù)據(jù),獲取對(duì)端的地址 udpConn.ReadFromUDP() —— 返回:n,clientAddr, err

4.? 發(fā)送數(shù)據(jù)包給 客戶端 udpConn.WriteToUDP("數(shù)據(jù)", clientAddr)

UDP-CS-Client實(shí)現(xiàn)流程:

1.? 創(chuàng)建用于通信的 socket。 net.Dial("udp", "服務(wù)器IP:port") —— udpConn (socket)

2.? 以后流程參見 TCP客戶端實(shí)現(xiàn)源碼。

UDPserver默認(rèn)就支持并發(fā)!

------------------------------------

命令行參數(shù): 在main函數(shù)啟動(dòng)時(shí),向整個(gè)程序傳參。 【重點(diǎn)】

語法: go run xxx.go ? argv1 argv2? argv3? argv4 。。。

xxx.exe:? 第 0 個(gè)參數(shù)。

argv1 :第 1 個(gè)參數(shù)。

argv2 :第 2 個(gè)參數(shù)。

argv3 :第 3 個(gè)參數(shù)。

argv4 :第 4 個(gè)參數(shù)。

使用: list := os.Args? 提取所有命令行參數(shù)。

獲取文件屬性函數(shù):

os.stat(文件訪問絕對(duì)路徑) —— fileInfo 接口

fileInfo 包含 兩個(gè)接口。

Name() 獲取文件名。 不帶訪問路徑

Size() 獲取文件大小。

網(wǎng)絡(luò)文件傳輸 —— 發(fā)送端(客戶端)

1.? 獲取命令行參數(shù),得到文件名(帶路徑)filePath list := os.Args

2.? 使用 os.stat() 獲取 文件名(不帶路徑)fileName

3.? 創(chuàng)建 用于數(shù)據(jù)傳輸?shù)?socket? net.Dial("tcp", “服務(wù)器IP+port”) —— conn

4.? 發(fā)送文件名(不帶路徑)? 給接收端, conn.write()

5.? 讀取 接收端回發(fā)“ok”,判斷無誤。封裝函數(shù) sendFile(filePath, conn) 發(fā)送文件內(nèi)容

6.? 實(shí)現(xiàn) sendFile(filePath,? conn)

1) 只讀打開文件 os.Open(filePath)

for {

2) 從文件中讀數(shù)據(jù)? f.Read(buf)

3) 將讀到的數(shù)據(jù)寫到socket中? conn.write(buf[:n])

4)判斷讀取文件的 結(jié)尾。 io.EOF. 跳出循環(huán)

}

網(wǎng)絡(luò)文件傳輸 —— 接收端(服務(wù)器)

1. 創(chuàng)建用于監(jiān)聽的 socket net.Listen() —— listener

2. 借助listener 創(chuàng)建用于 通信的 socket listener.Accpet()? —— conn

3. 讀取 conn.read() 發(fā)送端的 文件名, 保存至本地。

4. 回發(fā) “ok”應(yīng)答 發(fā)送端。

5. 封裝函數(shù),接收文件內(nèi)容 recvFile(文件路徑)

1) f = os.Create(帶有路徑的文件名)

for {

2)從 socket中讀取發(fā)送端發(fā)送的 文件內(nèi)容 。 conn.read(buf)

3)? 將讀到的數(shù)據(jù) 保存至本地文件 f.Write(buf[:n])

4)? 判斷 讀取conn 結(jié)束, 代表文件傳輸完成。 n == 0? break

}

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

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

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

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

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

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

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

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

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

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

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

本文名稱:包含用go語言實(shí)現(xiàn)通信協(xié)議的詞條
當(dāng)前網(wǎng)址:http://jinyejixie.com/article48/ddccohp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、電子商務(wù)企業(yè)建站、虛擬主機(jī)App開發(fā)、網(wǎng)站營(yíng)銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
长宁区| 保亭| 准格尔旗| 桐乡市| 开封市| 抚远县| 涞源县| 台山市| 左云县| 大英县| 九龙城区| 江北区| 视频| 文成县| 邵阳市| 和硕县| 宁安市| 梁山县| 连平县| 都江堰市| 彭泽县| 昭平县| 白朗县| 阜平县| 读书| 南宫市| 长阳| 呼图壁县| 林周县| 巴塘县| 驻马店市| 宁都县| 汽车| 韶关市| 本溪市| 和田市| 射洪县| 东至县| 横山县| 嵊州市| 花莲县|