TCP 和 UDP 服務端隨處可見,它們基于 TCP/IP 協(xié)議棧,通過網絡為客戶端提供服務。在這篇文章中,我將介紹如何使用 Go 語言開發(fā)一個用于返回隨機數(shù)、支持并發(fā)的 TCP 服務端。對于每一個來自 TCP 客戶端的連接,它都會啟動一個新的 goroutine(輕量級線程)來處理相應的請求。
創(chuàng)新互聯(lián)企業(yè)建站,十多年網站建設經驗,專注于網站建設技術,精于網頁設計,有多年建站和網站代運營經驗,設計師為客戶打造網絡企業(yè)風格,提供周到的建站售前咨詢和貼心的售后服務。對于網站建設、成都網站設計中不同領域進行深入了解和探索,創(chuàng)新互聯(lián)在網站建設中充分了解客戶行業(yè)的需求,以靈動的思維在網頁中充分展現(xiàn),通過對客戶行業(yè)精準市場調研,為客戶提供的解決方案。
你可以在 GitHub 上找到本項目的源碼:concTcp.go。
這個程序的主要邏輯在 handleConnection 函數(shù)中,具體實現(xiàn)如下:
在 main 函數(shù)的實現(xiàn)部分,每當 TCP 服務端收到 TCP 客戶端的連接請求,它都會啟動一個新的 goroutine 來為這個請求提供服務。
首先, main 確保程序至少有一個命令行參數(shù)。注意,現(xiàn)有代碼并沒有檢查這個參數(shù)是否為有效的 TCP 端口號。不過,如果它是一個無效的 TCP 端口號, net.Listen 就會調用失敗,并返回一個錯誤信息,類似下面這樣:
net.Listen 函數(shù)用于告訴 Go 接受網絡連接,因而承擔了服務端的角色。它的返回值類型是 net.Conn ,后者實現(xiàn)了 io.Reader 和 io.Writer 接口。此外, main 函數(shù)中還調用了 rand.Seed 函數(shù),用于初始化隨機數(shù)生成器。最后, for 循環(huán)允許程序一直使用 Accept 函數(shù)來接受 TCP 客戶端的連接請求,并以 goroutine 的方式來運行 handleConnection(c) 函數(shù),處理客戶端的后續(xù)請求。
net.Listen 函數(shù)的第一個參數(shù)定義了使用的網絡類型,而第二個參數(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 網絡連接,它占用了 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 get -v -u github.com/rocket049/connpool
go get -v -u gitee.com/rocket049/connpool
rocket049/connpool 包是本人用go語言開發(fā)的,提供一個通用的TCP連接池,初始化參數(shù)包括最高連接數(shù)、超時秒數(shù)、連接函數(shù),放回連接池的連接被重新取出時,如果已經超時,將會自動重新連接;如果沒有超時,連接將被復用。
可調用的函數(shù):
調用示例:
TL;DR 在使用 Golang 編寫 TCP/UDP socket 的時候,第一步做的就是地址解析。
該函數(shù)返回的地址包含的信息如下:
TCPAddr 里, IP 既可以是 IPv4 地址,也可以是 IPv6 地址。 Port 就是端口了。 Zone 是 IPv6 本地地址所在的區(qū)域。
從返回結果看該函數(shù)的參數(shù), network 指 address 的網絡類型; address 指要解析的地址,會從中解析出我們想要的 IP , Port 和 Zone 。
從源碼中可以看出,參數(shù) network 只能是如下四個值,否則會得到一個錯誤。
解析過程跟 ResolveTCPAddr 的一樣,不過得到的是 *UDPAddr 。
UDPAddr 包含的信息如下:
網頁題目:go語言開發(fā)tcp程序,go socket編程
URL標題:http://m.kartarina.com/article42/heieec.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供定制網站、靜態(tài)網站、ChatGPT、搜索引擎優(yōu)化、自適應網站、移動網站建設
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)