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

Go語(yǔ)言實(shí)現(xiàn)UDP協(xié)議及TCP通訊

 更新時(shí)間:2022年07月25日 08:34:16   作者:奮斗的大橙子  
這篇文章介紹了Go語(yǔ)言實(shí)現(xiàn)UDP協(xié)議及TCP通訊的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

?、使用Golang創(chuàng)建?一個(gè)TCP連接

1.服務(wù)端處理理流程

  • a.監(jiān)聽端口
  • b.接受客戶端的鏈接
  • c.創(chuàng)建Goroutine,處理這個(gè)鏈接(?個(gè)服務(wù)端要鏈接多個(gè)客戶端,所以使用Goroutine?常簡(jiǎn)單)

題外話:要是用Java、C#服務(wù)這邊每?個(gè)請(qǐng)求都開?個(gè)線程處理的話,頂多?千個(gè),但是Goroutine就?常簡(jiǎn)單。

package main
 
import (
    "fmt"
    "net"
)
 
func main() {
    //1.建立監(jiān)聽端口
    listen, err := net.Listen("tcp", "0.0.0.0:20000")
    if err != nil {
        fmt.Println("listen failed, err:", err)
        return
    }
 
    fmt.Println("listen Start...:")
 
    for {
        //2.接收客戶端的鏈接
        conn, err := listen.Accept()
        if err != nil {
            fmt.Printf("accept failed, err:%v\n", err)
            continue
        }
        //3.開啟一個(gè)Goroutine,處理鏈接
        go process(conn)
    }
}
 
//處理請(qǐng)求,類型就是net.Conn
func process(conn net.Conn) {
 
    //處理結(jié)束后關(guān)閉鏈接
    defer conn.Close()
    for {
        var buf [128]byte
        n, err := conn.Read(buf[:])
        if err != nil {
            fmt.Printf("read from conn failed, err:%v", err)
            break
        }
        fmt.Printf("recv from client, content:%v\n", string(buf[:n]))
    }
 
}

2.客戶端處理流程

  • a.和服務(wù)端建立一個(gè)鏈接
  • b.進(jìn)行數(shù)據(jù)的收發(fā)
  • c.關(guān)閉鏈接
package main
 
import (
    "bufio"
    "fmt"
    "net"
    "os"
    "strings"
)
 
func main() {
    //1.建立一個(gè)鏈接(Dial撥號(hào))
    conn, err := net.Dial("tcp", "0.0.0.0:20000")
    if err != nil {
        fmt.Printf("dial failed, err:%v\n", err)
        return
    }
 
    fmt.Println("Conn Established...:")
 
    //讀入輸入的信息
    reader := bufio.NewReader(os.Stdin)
    for {
        data, err := reader.ReadString('\n')
        if err != nil {
            fmt.Printf("read from console failed, err:%v\n", err)
            break
        }
 
        data = strings.TrimSpace(data)
        //傳輸數(shù)據(jù)到服務(wù)端
        _, err = conn.Write([]byte(data))
        if err != nil {
            fmt.Printf("write failed, err:%v\n", err)
            break
        }
    }
}

執(zhí)??下:

客戶端:

服務(wù)端:

?、使用Golang創(chuàng)建?個(gè)HTTP連接

  • A.HTTP協(xié)議是基于TCP協(xié)議之上的?本協(xié)議。
  • B.每行?本使?\r\n結(jié)尾,當(dāng)連續(xù)兩個(gè)\r\n時(shí),表示整個(gè)數(shù)據(jù)包結(jié)束。
package main
 
import (
    "fmt"
    "io"
    "net"
)
 
func main() {
    conn, err := net.Dial("tcp", "www.baidu.com:80")
    if err != nil {
        fmt.Printf("dial failed, err:%v\n", err)
        return
    }
 
    data := "GET / HTTP/1.1\r\n"
    data += "HOST: www.baidu.com\r\n"
    data += "connection: close\r\n"
    data += "\r\n\r\n"
 
    //寫入數(shù)據(jù)
    _, err = io.WriteString(conn, data)
    if err != nil {
        fmt.Printf("wirte string failed, err:%v\n", err)
        return
    }
 
    var buf [1024]byte
    for {
        //讀取返回的數(shù)據(jù)
        n, err := conn.Read(buf[:])
        if err != nil || n == 0 {
            break
        }
 
        fmt.Println(string(buf[:n]))
    }
}

三、使?用Golang創(chuàng)建?個(gè)UDP連接

1.服務(wù)流程,相比于TCP連接需要Accept一個(gè)鏈接,UDP不需要進(jìn)?這步操作,服務(wù)端代碼如下:

package main
 
import (
    "fmt"
    "net"
)
 
func main() {
    //建立一個(gè)UDP的監(jiān)聽,這里使用的是ListenUDP,并且地址是一個(gè)結(jié)構(gòu)體
    listen, err := net.ListenUDP("udp", &net.UDPAddr{
        IP:   net.IPv4(0, 0, 0, 0),
        Port: 8080,
    })
    if err != nil {
        fmt.Printf("listen failed, err:%v\n", err)
        return
    }
 
    for {
        var data [1024]byte
        //讀取UDP數(shù)據(jù)
        count, addr, err := listen.ReadFromUDP(data[:])
        if err != nil {
            fmt.Printf("read udp failed, err:%v\n", err)
            continue
        }
 
        fmt.Printf("data:%s addr:%v count:%d\n", string(data[0:count]), addr, count)
        //返回?cái)?shù)據(jù)
        _, err = listen.WriteToUDP([]byte("hello client"), addr)
        if err != nil {
            fmt.Printf("write udp failed, err:%v\n", err)
            continue
        }
    }
}

2.客戶端流程

package main
 
import (
    "fmt"
    "net"
)
 
func main() {
    // 創(chuàng)建連接
    socket, err := net.DialUDP("udp4", nil, &net.UDPAddr{
        IP:   net.IPv4(127, 0, 0, 1),
        Port: 8080,
    })
    if err != nil {
        fmt.Println("連接失敗!", err)
        return
    }
    defer socket.Close()
    // 發(fā)送數(shù)據(jù)
    senddata := []byte("hello server!")
    _, err = socket.Write(senddata)
    if err != nil {
        fmt.Println("發(fā)送數(shù)據(jù)失敗!", err)
        return
    }
    // 接收數(shù)據(jù)
    data := make([]byte, 4096)
    read, remoteAddr, err := socket.ReadFromUDP(data)
    if err != nil {
        fmt.Println("讀取數(shù)據(jù)失敗!", err)
        return
    }
    fmt.Println(read, remoteAddr)
    fmt.Printf("%s\n", data)
}

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

相關(guān)文章

  • graphql---go http請(qǐng)求使用詳解

    graphql---go http請(qǐng)求使用詳解

    這篇文章主要介紹了graphql---go http請(qǐng)求使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2020-12-12
  • golang?gorm框架數(shù)據(jù)庫(kù)的連接操作示例

    golang?gorm框架數(shù)據(jù)庫(kù)的連接操作示例

    這篇文章主要為大家介紹了golang?gorm框架數(shù)據(jù)庫(kù)操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • 深入淺出Go:掌握基礎(chǔ)知識(shí)的關(guān)鍵要點(diǎn)

    深入淺出Go:掌握基礎(chǔ)知識(shí)的關(guān)鍵要點(diǎn)

    Go是一種開源的編程語(yǔ)言,由Google開發(fā),它具有簡(jiǎn)潔、高效、并發(fā)性強(qiáng)的特點(diǎn),適用于構(gòu)建可靠的、高性能的軟件系統(tǒng),本文將介紹Go的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2023-10-10
  • 深入探索Go?1.21中的?maps工具庫(kù)

    深入探索Go?1.21中的?maps工具庫(kù)

    隨著?Go?1.21.0?版本的發(fā)布,新增了兩個(gè)實(shí)用的泛型工具庫(kù):maps?和?slices,下面小編就帶大家一起學(xué)習(xí)一下?maps?工具庫(kù)的相關(guān)知識(shí)吧
    2023-08-08
  • Golang實(shí)踐指南之獲取目錄文件列表

    Golang實(shí)踐指南之獲取目錄文件列表

    在搭建項(xiàng)目中一般都會(huì)有確定項(xiàng)目根目錄的絕對(duì)路徑的需求,下面這篇文章主要給大家介紹了關(guān)于Golang實(shí)踐指南之獲取目錄文件列表的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • go-micro集成RabbitMQ實(shí)戰(zhàn)和原理詳解

    go-micro集成RabbitMQ實(shí)戰(zhàn)和原理詳解

    本文主要介紹go-micro使用RabbitMQ收發(fā)數(shù)據(jù)的方法和原理,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Go語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)介紹

    Go語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)介紹

    在本篇文章里小編給大家整理的是一篇關(guān)于Go語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)介紹內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)參考下。
    2021-07-07
  • Go語(yǔ)言dolphinscheduler任務(wù)調(diào)度處理

    Go語(yǔ)言dolphinscheduler任務(wù)調(diào)度處理

    這篇文章主要為大家介紹了Go語(yǔ)言dolphinscheduler任務(wù)調(diào)度處理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • go語(yǔ)言beego框架web開發(fā)語(yǔ)法筆記示例

    go語(yǔ)言beego框架web開發(fā)語(yǔ)法筆記示例

    這篇文章主要為大家介紹了go語(yǔ)言beego框架web開發(fā)語(yǔ)法筆記示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • 關(guān)于go-zero服務(wù)自動(dòng)收集問題分析

    關(guān)于go-zero服務(wù)自動(dòng)收集問題分析

    這篇文章主要介紹了關(guān)于go-zero服務(wù)自動(dòng)收集問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12

最新評(píng)論

抚松县| 乐陵市| 穆棱市| 东乡族自治县| 长白| 准格尔旗| 恩施市| 四平市| 贵阳市| 石首市| 漠河县| 青神县| 台山市| 休宁县| 渭源县| 资溪县| 绥中县| 大姚县| 安远县| 望都县| 临沧市| 普兰店市| 靖西县| 固安县| 达尔| 雅安市| 英吉沙县| 佳木斯市| 那坡县| 革吉县| 聂荣县| 资中县| 历史| 清水河县| 木里| 阿瓦提县| 德兴市| 深圳市| 建宁县| 逊克县| 黔西县|