成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

在 Go 中實現一個支持并發的 TCP 服務端

開發 后端
在這篇文章中,我將介紹如何使用 Go 語言 開發一個用于返回隨機數、支持并發的 TCP 服務端。對于每一個來自 TCP 客戶端的連接,它都會啟動一個新的 goroutine(輕量級線程)來處理相應的請求。


僅用大約 65 行代碼,開發一個用于生成隨機數、支持并發的 TCP 服務端。


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

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

處理 TCP 連接

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

func handleConnection(c net.Conn) {
        fmt.Printf("Serving %s\n", c.RemoteAddr().String())
        for {
                netData, err := bufio.NewReader(c).ReadString('\n')
                if err != nil {
                        fmt.Println(err)
                        return
                }

                temp := strings.TrimSpace(string(netData))
                if temp == "STOP" {
                        break
                }

                result := strconv.Itoa(random()) + "\n"
                c.Write([]byte(string(result)))
        }
        c.Close()
}

如果 TCP 客戶端發送了一個 “STOP” 字符串,為它提供服務的 goroutine 就會終止;否則,TCP 服務端就會返回一個隨機數給它。只要客戶端不主動終止,服務端就會一直提供服務,這是由 ??for?? 循環保證的。具體來說,??for?? 循環中的代碼使用了 ??bufio.NewReader(c).ReadString('\n')?? 來逐行讀取客戶端發來的數據,并使用 ??c.Write([]byte(string(result)))?? 來返回數據(生成的隨機數)。你可以在 Go 的 net 標準包 ??文檔?? 中了解更多。

支持并發

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

func main() {
        arguments := os.Args
        if len(arguments) == 1 {
                fmt.Println("Please provide a port number!")
                return
        }

        PORT := ":" + arguments[1]
        l, err := net.Listen("tcp4", PORT)
        if err != nil {
                fmt.Println(err)
                return
        }
        defer l.Close()
        rand.Seed(time.Now().Unix())

        for {
                c, err := l.Accept()
                if err != nil {
                        fmt.Println(err)
                        return
                }
                go handleConnection(c)
        }
}

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

$ go run concTCP.go 12a
listen tcp4: lookup tcp4/12a: nodename nor servname provided, or not known
$ go run concTCP.go -10
listen tcp4: address -10: invalid port

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

net.Listen() 的第一個參數

??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 客戶端時,你會得到類似下面的輸出:

$ go run concTCP.go 8001
Serving 127.0.0.1:62554
Serving 127.0.0.1:62556

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

$ netstat -anp TCP | grep 8001
tcp4       0      0  127.0.0.1.8001         127.0.0.1.62556        ESTABLISHED
tcp4       0      0  127.0.0.1.62556        127.0.0.1.8001         ESTABLISHED
tcp4       0      0  127.0.0.1.8001         127.0.0.1.62554        ESTABLISHED
tcp4       0      0  127.0.0.1.62554        127.0.0.1.8001         ESTABLISHED
tcp4       0      0  *.8001                 *.*                    LISTEN

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

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

concTCP.go TCP 服務端測試

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

是用 nc 工具作為 concTCP.go 的 TCP 客戶端

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

總結

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

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2024-01-02 13:58:04

GoREST API語言

2024-03-15 15:20:10

并發服務IP

2024-01-02 12:17:44

Go傳統遠程

2017-04-11 16:16:48

HTTPS互聯網服務端

2024-04-01 13:18:15

App架構服務端

2023-09-11 10:53:32

2022-06-14 15:07:04

IPC客戶端服務端

2021-11-10 15:18:16

JavaGo命令

2022-09-05 14:36:26

服務端TCP連接

2011-03-15 16:07:33

Windows AzuWCF

2020-06-15 08:25:35

Linux 系統 數據

2020-06-15 08:13:42

Linux服務端并發數

2021-04-30 09:32:38

服務端渲染SSR

2015-10-12 08:33:06

TCP網絡協議服務端

2020-06-28 08:10:00

GoGOSSAFUNC圖編程語言

2011-03-15 15:43:39

Windows AzuWCF

2011-03-15 16:12:00

Windows AzuWCF

2021-07-02 07:18:19

Goresults通道類型

2023-02-26 01:37:57

goORM代碼

2024-01-08 08:36:29

HTTPGo代理服務器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: www视频在线观看 | 精品一二三区 | 亚洲精品www久久久久久广东 | 精品一区二区三区中文字幕 | 久久精品视频在线播放 | 91亚洲国产成人久久精品网站 | 中文字幕视频在线观看免费 | 午夜精品久久久久久 | 久久蜜桃精品 | 久久久久久av | 最新中文字幕第一页视频 | 久久久久久亚洲精品 | 黑人精品欧美一区二区蜜桃 | 日韩视频一区 | a免费视频| 97国产爽爽爽久久久 | 久久久久久久久久久高潮一区二区 | 国产高清视频在线播放 | 欧美日日 | 国产在线精品一区二区 | 综合久久综合久久 | 福利片在线观看 | 国产乱精品一区二区三区 | 久久国产免费 | 麻豆视频在线免费看 | 蜜桃传媒一区二区 | 亚洲 自拍 另类 欧美 丝袜 | 欧洲免费毛片 | 亚洲精品99| 在线观看成人免费视频 | 免费观看一级特黄欧美大片 | 欧美在线天堂 | 亚洲日本免费 | 在线91 | 一区二区在线 | 日日操操操| 逼逼网 | 亚洲综合久久久 | 日韩中文字幕在线 | 国产一区二区在线播放 | 伊人精品一区二区三区 |