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

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

go語言tcp服務器框架 go 網(wǎng)絡框架

【golang】高并發(fā)下TCP常見問題解決方案

首先,看一下TCP握手簡單描繪過程:

創(chuàng)新互聯(lián)是一家以網(wǎng)站建設公司、網(wǎng)頁設計、品牌設計、軟件運維、seo優(yōu)化、小程序App開發(fā)等移動開發(fā)為一體互聯(lián)網(wǎng)公司。已累計為水處理設備等眾行業(yè)中小客戶提供優(yōu)質的互聯(lián)網(wǎng)建站和軟件開發(fā)服務。

其握手過程原理,就不必說了,有很多詳細文章進行敘述,本文只關注研究重點。

在第三次握手過程中,如果服務器收到ACK,就會與客戶端建立連接,此時內(nèi)核會把連接從半連接隊列移除,然后創(chuàng)建新的連接,并將其添加到全連接隊列,等待進程調(diào)用。

如果服務器繁忙,來不及調(diào)用連接導致全連接隊列溢出,服務器就會放棄當前握手連接,發(fā)送RST給客戶端,即connection reset by peer。

在linux平臺上,客戶端在進行高并發(fā)TCP連接處理時,最高并發(fā)數(shù)量都要受系統(tǒng)對用戶單一進程同時打開文件數(shù)量的限制(這是因為系統(tǒng)每個TCP都是SOCKET句柄,每個soker句柄都是一個文件),當打開連接超過限制,就會出現(xiàn)too many open files。

使用下指令查看最大句柄數(shù)量:

增加句柄解決方案

go語言tcp客戶端怎么和服務端鏈接

網(wǎng)絡連接需要用socket,易語言用查易語言socket用或者看看否TCP協(xié)議相關組件

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

三次握手:

1. 主動發(fā)起連接請求端(客戶端),發(fā)送 SYN 標志位,攜帶數(shù)據(jù)包、包號

2. 被動接收連接請求端(服務器),接收 SYN,回復 ACK,攜帶應答序列號。同時,發(fā)送SYN標志位,攜帶數(shù)據(jù)包、包號

3. 主動發(fā)起連接請求端(客戶端),接收SYN 標志位,回復 ACK。

被動端(服務器)接收 ACK —— 標志著 三次握手建立完成( Accept()/Dial() 返回 )

四次揮手:

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

2. 被動接受斷開連接端(服務器), 發(fā)送 ACK標志,攜帶應答序列號。 —— 半關閉完成。

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

4. 主動請求斷開連接端(客戶端), 發(fā)送 最后一個 ACK標志,攜帶應答序列號。—— 發(fā)送完成,客戶端不會直接退出,等 2MSL時長。

等 2MSL待目的:確保服務器 收到最后一個ACK

滑動窗口:

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

TCP狀態(tài)轉換:

1. 主動發(fā)起連接請求端:

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

2. 主動關閉連接請求端:

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

—— 接收FIN、回復ACK —— TIME_WAIT (主動端) —— 等 2MSL 時長 —— CLOSED

3. 被動建立連接請求端:

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

4. 被動斷開連接請求端:

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

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

netstat -an | findstr? 端口號

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

netstat -an | grep? 端口號

TCP和UDP對比:?

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

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

優(yōu)點???????????????????????????????????????????????????????????? 缺點

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

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

使用場景:

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

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

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

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

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

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

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

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

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

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

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

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

命令行參數(shù): 在main函數(shù)啟動時,向整個程序傳參。 【重點】

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

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

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

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

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

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

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

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

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

fileInfo 包含 兩個接口。

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

Size() 獲取文件大小。

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

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

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

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

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

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

6.? 實現(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)判斷讀取文件的 結尾。 io.EOF. 跳出循環(huán)

}

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

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

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

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

4. 回發(fā) “ok”應答 發(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 結束, 代表文件傳輸完成。 n == 0? break

}

在 Go 中實現(xiàn)一個支持并發(fā)的 TCP 服務端

TCP 和 UDP 服務端隨處可見,它們基于 TCP/IP 協(xié)議棧,通過網(wǎng)絡為客戶端提供服務。在這篇文章中,我將介紹如何使用 Go 語言開發(fā)一個用于返回隨機數(shù)、支持并發(fā)的 TCP 服務端。對于每一個來自 TCP 客戶端的連接,它都會啟動一個新的 goroutine(輕量級線程)來處理相應的請求。

你可以在 GitHub 上找到本項目的源碼:concTcp.go。

這個程序的主要邏輯在 handleConnection 函數(shù)中,具體實現(xiàn)如下:

在 main 函數(shù)的實現(xiàn)部分,每當 TCP 服務端收到 TCP 客戶端的連接請求,它都會啟動一個新的 goroutine 來為這個請求提供服務。

首先, main 確保程序至少有一個命令行參數(shù)。注意,現(xiàn)有代碼并沒有檢查這個參數(shù)是否為有效的 TCP 端口號。不過,如果它是一個無效的 TCP 端口號, net.Listen 就會調(diào)用失敗,并返回一個錯誤信息,類似下面這樣:

net.Listen 函數(shù)用于告訴 Go 接受網(wǎng)絡連接,因而承擔了服務端的角色。它的返回值類型是 net.Conn ,后者實現(xiàn)了 io.Reader 和 io.Writer 接口。此外, main 函數(shù)中還調(diào)用了 rand.Seed 函數(shù),用于初始化隨機數(shù)生成器。最后, for 循環(huán)允許程序一直使用 Accept 函數(shù)來接受 TCP 客戶端的連接請求,并以 goroutine 的方式來運行 handleConnection(c) 函數(shù),處理客戶端的后續(xù)請求。

net.Listen 函數(shù)的第一個參數(shù)定義了使用的網(wǎng)絡類型,而第二個參數(shù)定義了服務端監(jiān)聽的地址和端口號。第一個參數(shù)的有效值為 tcp 、 tcp4 、 tcp6 、 udp 、 udp4 、 udp6 、 ip 、 ip4 、 ip6 、 Unix (Unix 套接字)、 Unixgram 和 Unixpacket ,其中: tcp4 、 udp4 和 ip4 只接受 IPv4 地址,而 tcp6 、 udp6 和 ip6 只接受 IPv6 地址。

concTCP.go 需要一個命令行參數(shù),來指定監(jiān)聽的端口號。當它開始服務 TCP 客戶端時,你會得到類似下面的輸出:

netstat 的輸出可以確認 congTCP.go 正在為多個 TCP 客戶端提供服務,并且仍在繼續(xù)監(jiān)聽建立連接的請求:

在上面輸出中,最后一行顯示了有一個進程正在監(jiān)聽 8001 端口,這意味著你可以繼續(xù)連接 TCP 的 8001 端口。第一行和第二行顯示了有一個已建立的 TCP 網(wǎng)絡連接,它占用了 8001 和 62556 端口。相似地,第三行和第四行顯示了有另一個已建立的 TCP 連接,它占用了 8001 和 62554 端口。

下面這張圖片顯示了 concTCP.go 在服務多個 TCP 客戶端時的輸出:

類似地,下面這張圖片顯示了兩個 TCP 客戶端的輸出(使用了 nc 工具):

你可以在 維基百科上找到更多關于 nc (即 netcat )的信息。

現(xiàn)在,你學會了如何用大約 65 行 Go 代碼來開發(fā)一個生成隨機數(shù)、支持并發(fā)的 TCP 服務端,這真是太棒了!如果你想要讓你的 TCP 服務端執(zhí)行別的任務,只需要修改 handleConnection 函數(shù)即可。

via:

作者:Mihalis Tsoukalos選題:lkxed譯者:lkxed校對:wxy


本文題目:go語言tcp服務器框架 go 網(wǎng)絡框架
鏈接地址:http://weahome.cn/article/hgghpj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部