a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > Golang > 正文

在Go中構建并發TCP服務器

2020-04-01 18:52:02
字體:
來源:轉載
供稿:網友

開發一個并發TCP服務器,該服務器僅使用大約65行GO代碼生成隨機數。

TCP和UDP服務器隨處可見,通過TCP/IP網絡為網絡客戶端提供服務。在本文中,我將在GO編程語言,返回隨機數。對于來自TCP客戶端的每個傳入連接,TCP服務器將啟動一個新的goroutine來處理該請求。
你可以找到這個項目,concTCP.go,在GitHub上。

處理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”字符串,那么為該特定TCP客戶端提供服務的goroutine將終止;否則,TCP服務器將向TCP客戶端發送隨機數。for循環確保TCP客戶端將在TCP客戶端所需的時間內得到服務??丶械腉O代碼。for循環從tcp客戶端逐行讀取數據,使用bufio.NewReader(c).ReadString('/n')并使用c.Write([]byte(string(result)))。

兼容并蓄

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()如果出現類似以下錯誤消息,將失?。?/p>

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

net.Listen()Call用于告訴GO程序接受網絡連接,從而充當服務器。的返回值net.Listen()是net.Conn類型,它實現io.Reader和io.Writer接口。main()函數還調用rand.Seed()函數來初始化隨機數生成器。最后,for循環允許程序繼續接受新的tcp客戶端。Accept()的實例來處理handleConnection()函數,該函數作為goroutines執行。

net.Listen()的第一個參數

的第一個參數net.Listen()函數定義將要使用的網絡類型,而第二個參數定義服務器地址以及服務器將偵聽的端口號。第一個參數的有效值是TCP、tcp 4(僅IPv 4-)、tcp 6(僅IPv 6)、UDP、udp 4(僅IPv 4-)、udp 6(僅IPv 6)、IP、IP4(僅IPv 4-)、ip6(僅IPv 6)、Unix(Unix套接字)、Unixgram和UnixPacket。

運行中的并發tcp服務器。

ctCP.go需要一個命令行參數,這是它要偵聽的端口號。在為TCP客戶端提供服務時,從ctCP.go獲得的輸出將類似于以下內容:

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

輸出netstat(1)可以驗證ctCP.go服務于多個TCP客戶端,同時偵聽更多連接:

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

前面命令輸出的最后一行通知我們,有一個進程偵聽端口8001,這意味著您仍然可以連接到TCP端口8001。前兩行驗證是否存在使用端口號8001和62556的已建立的tcp網絡連接。類似地,第三行和第四行驗證是否存在使用端口號8001和62554的另一個已建立的tcp連接。

下圖顯示了在為多個TCP客戶端提供服務時,ctCP.go的輸出:

Go,并發,TCP服務器

ctCP.go TCP服務器正在運行。

類似地,下面的映像顯示了兩個TCP客戶機的輸出,它們使用nc(1)效用:

Go,并發,TCP服務器

摘要

因此,您剛剛學習了如何開發一個并發TCP服務器,該服務器使用大約65行GO代碼生成隨機數,這是相當令人印象深刻的!如果希望TCP服務器執行不同的任務,只需更改handleConnection()功能。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VEVB武林網的支持。如果你想了解更多相關內容請查看下面相關鏈接


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 免费在线日本 | 一级黄色毛片子 | 中文字幕二区 | 国产一页 | 久久精av | 亚洲黄色高清视频 | 一级毛片,一级毛片 | 国产第一毛片 | 国产精品久久久久9999赢消 | 毛片免费视频 | 色综合天天综合网天天看片 | 国产精品一区二区精品 | 欧美成人一级片 | 日韩欧美视频 | 91在线综合 | 91视频专区 | 精品影视 | 一区二区视频 | 欧美精品久久 | 最新精品在线 | 免费在线黄色av | 国产视频三区 | 亚洲v日韩v综合v精品v | 国产欧美日韩在线 | 91高清视频在线观看 | 九色av| 久久久精品视频在线观看 | 国产精品一区一区三区 | 99re6热在线精品视频播放 | 天天干 夜夜操 | 91成人在线视频 | 久久国产精品99久久久久久老狼 | 五月婷久久 | 精品一区二区三区三区 | 国产精品久久久久久久久 | 日本精品在线观看 | 天天操天天干天天爽 | 国产福利一区二区三区四区 | 日韩中文视频 | 国产精品久久久久久吹潮 | 欧美日韩另类在线 |