最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在Go中構(gòu)建并發(fā)TCP服務(wù)器

 更新時間:2018年10月10日 11:41:34   作者:Mihalis Tsoukalos  
今天小編就為大家分享一篇關(guān)于在Go中構(gòu)建并發(fā)TCP服務(wù)器的文章,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

開發(fā)一個并發(fā)TCP服務(wù)器,該服務(wù)器僅使用大約65行GO代碼生成隨機(jī)數(shù)。

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

處理TCP連接

程序的邏輯可以在handleConnection()職能,其實現(xiàn)方式如下:

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

兼容并蓄

main()函數(shù)的實現(xiàn)告訴TCP服務(wù)器每次必須為TCP客戶端服務(wù)時啟動一個新的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()確保程序至少有一個命令行參數(shù)。注意,現(xiàn)有代碼不檢查給定的命令行參數(shù)是否為有效的TCP端口號。但是,如果給定的值不是有效的tcp端口號,則調(diào)用net.Listen()如果出現(xiàn)類似以下錯誤消息,將失?。?/p>

$ 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()Call用于告訴GO程序接受網(wǎng)絡(luò)連接,從而充當(dāng)服務(wù)器。的返回值net.Listen()是net.Conn類型,它實現(xiàn)io.Reader和io.Writer接口。main()函數(shù)還調(diào)用rand.Seed()函數(shù)來初始化隨機(jī)數(shù)生成器。最后,for循環(huán)允許程序繼續(xù)接受新的tcp客戶端。Accept()的實例來處理handleConnection()函數(shù),該函數(shù)作為goroutines執(zhí)行。

net.Listen()的第一個參數(shù)

的第一個參數(shù)net.Listen()函數(shù)定義將要使用的網(wǎng)絡(luò)類型,而第二個參數(shù)定義服務(wù)器地址以及服務(wù)器將偵聽的端口號。第一個參數(shù)的有效值是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。

運行中的并發(fā)tcp服務(wù)器。

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

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

輸出netstat(1)可以驗證ctCP.go服務(wù)于多個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

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

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

ctCP.go TCP服務(wù)器正在運行。

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

摘要

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

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接

相關(guān)文章

  • Golang利用compress/flate包來壓縮和解壓數(shù)據(jù)

    Golang利用compress/flate包來壓縮和解壓數(shù)據(jù)

    在處理需要高效存儲和快速傳輸?shù)臄?shù)據(jù)時,數(shù)據(jù)壓縮成為了一項不可或缺的技術(shù),Go語言的compress/flate包為我們提供了對DEFLATE壓縮格式的原生支持,本文將深入探討compress/flate包的使用方法,揭示如何利用它來壓縮和解壓數(shù)據(jù),并提供實際的代碼示例,需要的朋友可以參考下
    2024-08-08
  • 使用Golang實現(xiàn)Sm2加解密的代碼詳解

    使用Golang實現(xiàn)Sm2加解密的代碼詳解

    本文主要介紹了Go語言實現(xiàn)Sm2加解密的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • Golang 發(fā)送http請求時設(shè)置header的實現(xiàn)

    Golang 發(fā)送http請求時設(shè)置header的實現(xiàn)

    這篇文章主要介紹了Golang 發(fā)送http請求時設(shè)置header的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Go語言正則表達(dá)式用法實例小結(jié)【查找、匹配、替換等】

    Go語言正則表達(dá)式用法實例小結(jié)【查找、匹配、替換等】

    這篇文章主要介紹了Go語言正則表達(dá)式用法,結(jié)合實例形式分析了Go語言基于正則實現(xiàn)查找、匹配、替換等基本操作的實現(xiàn)技巧,需要的朋友可以參考下
    2017-01-01
  • golang中json操作的完全指南

    golang中json操作的完全指南

    golang標(biāo)準(zhǔn)庫有一個名叫encoding/json的包,包含了JSON的序列化(Marshal)和反序列化(Unmarshal)的能力,下面這篇文章主要給大家介紹了關(guān)于golang中json操作的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • Golang中生成隨機(jī)字符串并復(fù)制到粘貼板的方法

    Golang中生成隨機(jī)字符串并復(fù)制到粘貼板的方法

    這篇文章主要介紹了Golang中生成隨機(jī)字符串并復(fù)制到粘貼板的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • golang gorm 操作mysql及gorm基本用法

    golang gorm 操作mysql及gorm基本用法

    golang 官方的那個操作mysql的有點麻煩所以就使用了gorm,下面就gorm的使用做下簡單介紹,感興趣的朋友跟隨小編一起看看吧
    2018-11-11
  • Golang運行報錯找不到包:package?xxx?is?not?in?GOROOT的解決過程

    Golang運行報錯找不到包:package?xxx?is?not?in?GOROOT的解決過程

    這篇文章主要給大家介紹了關(guān)于Golang運行報錯找不到包:package?xxx?is?not?in?GOROOT的解決過程,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-07-07
  • Go語言中Timer計時器的使用技巧詳解

    Go語言中Timer計時器的使用技巧詳解

    Go語言中的time包里有個Timer計時器的功能,這篇文章主要就是來和大家介紹一下Timer計時器的使用技巧,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-07-07
  • 詳解Golang函數(shù)式選項(Functional?Options)模式

    詳解Golang函數(shù)式選項(Functional?Options)模式

    什么是函數(shù)式選項模式,為什么要這么寫,這個編程模式解決了什么問題呢?其實就是為了解決動態(tài)靈活的配置不同的參數(shù)的問題。下面通過本文給大家介紹Golang函數(shù)式選項(Functional?Options)模式的問題,感興趣的朋友一起看看吧
    2021-12-12

最新評論

义马市| 全南县| 通化县| 凤冈县| 涡阳县| 上饶市| 车险| 治县。| 广灵县| 阳高县| 邻水| 吉木萨尔县| 清镇市| 乌鲁木齐县| 如东县| 仁布县| 聂荣县| 公安县| 郎溪县| 麻阳| 芦山县| 建昌县| 武宣县| 渭源县| 开封市| 崇礼县| 曲松县| 通渭县| 康保县| 安平县| 铁力市| 平潭县| 南康市| 华坪县| 泽普县| 河北省| 台湾省| 康保县| 元朗区| 白水县| 即墨市|