首先,看一下TCP握手簡單描繪過程:
成都網站建設哪家好,找創新互聯!專注于網頁設計、成都網站建設、微信開發、微信小程序、集團成都企業網站建設等服務項目。核心團隊均擁有互聯網行業多年經驗,服務眾多知名企業客戶;涵蓋的客戶類型包括:成都PE包裝袋等眾多領域,積累了大量豐富的經驗,同時也獲得了客戶的一致贊譽!
其握手過程原理,就不必說了,有很多詳細文章進行敘述,本文只關注研究重點。
在第三次握手過程中,如果服務器收到ACK,就會與客戶端建立連接,此時內核會把連接從半連接隊列移除,然后創建新的連接,并將其添加到全連接隊列,等待進程調用。
如果服務器繁忙,來不及調用連接導致全連接隊列溢出,服務器就會放棄當前握手連接,發送RST給客戶端,即connection reset by peer。
在linux平臺上,客戶端在進行高并發TCP連接處理時,最高并發數量都要受系統對用戶單一進程同時打開文件數量的限制(這是因為系統每個TCP都是SOCKET句柄,每個soker句柄都是一個文件),當打開連接超過限制,就會出現too many open files。
使用下指令查看最大句柄數量:
增加句柄解決方案
TCP 和 UDP 服務端隨處可見,它們基于 TCP/IP 協議棧,通過網絡為客戶端提供服務。在這篇文章中,我將介紹如何使用 Go 語言開發一個用于返回隨機數、支持并發的 TCP 服務端。對于每一個來自 TCP 客戶端的連接,它都會啟動一個新的 goroutine(輕量級線程)來處理相應的請求。
你可以在 GitHub 上找到本項目的源碼:concTcp.go。
這個程序的主要邏輯在 handleConnection 函數中,具體實現如下:
在 main 函數的實現部分,每當 TCP 服務端收到 TCP 客戶端的連接請求,它都會啟動一個新的 goroutine 來為這個請求提供服務。
首先, main 確保程序至少有一個命令行參數。注意,現有代碼并沒有檢查這個參數是否為有效的 TCP 端口號。不過,如果它是一個無效的 TCP 端口號, net.Listen 就會調用失敗,并返回一個錯誤信息,類似下面這樣:
net.Listen 函數用于告訴 Go 接受網絡連接,因而承擔了服務端的角色。它的返回值類型是 net.Conn ,后者實現了 io.Reader 和 io.Writer 接口。此外, main 函數中還調用了 rand.Seed 函數,用于初始化隨機數生成器。最后, for 循環允許程序一直使用 Accept 函數來接受 TCP 客戶端的連接請求,并以 goroutine 的方式來運行 handleConnection(c) 函數,處理客戶端的后續請求。
net.Listen 函數的第一個參數定義了使用的網絡類型,而第二個參數定義了服務端監聽的地址和端口號。第一個參數的有效值為 tcp 、 tcp4 、 tcp6 、 udp 、 udp4 、 udp6 、 ip 、 ip4 、 ip6 、 Unix (Unix 套接字)、 Unixgram 和 Unixpacket ,其中: tcp4 、 udp4 和 ip4 只接受 IPv4 地址,而 tcp6 、 udp6 和 ip6 只接受 IPv6 地址。
concTCP.go 需要一個命令行參數,來指定監聽的端口號。當它開始服務 TCP 客戶端時,你會得到類似下面的輸出:
netstat 的輸出可以確認 congTCP.go 正在為多個 TCP 客戶端提供服務,并且仍在繼續監聽建立連接的請求:
在上面輸出中,最后一行顯示了有一個進程正在監聽 8001 端口,這意味著你可以繼續連接 TCP 的 8001 端口。第一行和第二行顯示了有一個已建立的 TCP 網絡連接,它占用了 8001 和 62556 端口。相似地,第三行和第四行顯示了有另一個已建立的 TCP 連接,它占用了 8001 和 62554 端口。
下面這張圖片顯示了 concTCP.go 在服務多個 TCP 客戶端時的輸出:
類似地,下面這張圖片顯示了兩個 TCP 客戶端的輸出(使用了 nc 工具):
你可以在 維基百科上找到更多關于 nc (即 netcat )的信息。
現在,你學會了如何用大約 65 行 Go 代碼來開發一個生成隨機數、支持并發的 TCP 服務端,這真是太棒了!如果你想要讓你的 TCP 服務端執行別的任務,只需要修改 handleConnection 函數即可。
via:
作者:Mihalis Tsoukalos選題:lkxed譯者:lkxed校對:wxy
網絡連接需要用socket,易語言用查易語言socket用或者看看否TCP協議相關組件
文章標題:go語言tcp服務器響應 go實現高并發TCP服務器
鏈接分享:http://m.kartarina.com/article40/hgjiho.html
成都網站建設公司_創新互聯,為您提供Google、網站營銷、小程序開發、商城網站、網站設計、品牌網站制作
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯