欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

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.開啟一個Goroutine,處理鏈接
        go process(conn)
    }
}
 
//處理請求,類型就是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ù)端建立一個鏈接
  • b.進行數(shù)據(jù)的收發(fā)
  • c.關(guān)閉鏈接
package main
 
import (
    "bufio"
    "fmt"
    "net"
    "os"
    "strings"
)
 
func main() {
    //1.建立一個鏈接(Dial撥號)
    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)建?個HTTP連接

  • A.HTTP協(xié)議是基于TCP協(xié)議之上的?本協(xié)議。
  • B.每行?本使?\r\n結(jié)尾,當(dāng)連續(xù)兩個\r\n時,表示整個數(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)建?個UDP連接

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

package main
 
import (
    "fmt"
    "net"
)
 
func main() {
    //建立一個UDP的監(jiān)聽,這里使用的是ListenUDP,并且地址是一個結(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)
        //返回數(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)
}

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

相關(guān)文章

  • 使用自定義錯誤碼攔截grpc內(nèi)部狀態(tài)碼問題

    使用自定義錯誤碼攔截grpc內(nèi)部狀態(tài)碼問題

    這篇文章主要介紹了使用自定義錯誤碼攔截grpc內(nèi)部狀態(tài)碼問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • golang beyla采集trace程序原理源碼解析

    golang beyla采集trace程序原理源碼解析

    beyla支持通過ebpf,無侵入的、自動采集應(yīng)用程序的trace信息,本文以golang的nethttp為例,講述beyla對trace的采集的實現(xiàn)原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2024-02-02
  • gtoken替換jwt實現(xiàn)sso登錄的排雷避坑

    gtoken替換jwt實現(xiàn)sso登錄的排雷避坑

    這篇文章主要為大家介紹了gtoken替換jwt實現(xiàn)sso登錄的排雷避坑,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Golang中panic的異常處理

    Golang中panic的異常處理

    本文主要介紹了Golang中panic的異常處理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 詳解Go語言中泛型的實現(xiàn)原理與使用

    詳解Go語言中泛型的實現(xiàn)原理與使用

    本文是對泛型的基本思想及其在?Go?中的實現(xiàn)的一個比較容易理解的介紹,同時也是對圍繞泛型的各種性能討論的簡單總結(jié),感興趣的可以學(xué)習(xí)一下
    2022-05-05
  • Go語言怎么使用變長參數(shù)函數(shù)

    Go語言怎么使用變長參數(shù)函數(shù)

    本文主要介紹了Go語言怎么使用變長參數(shù)函數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Go實現(xiàn)凱撒密碼加密解密

    Go實現(xiàn)凱撒密碼加密解密

    這篇文章主要為大家介紹了Go實現(xiàn)凱撒密碼加密解密示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Go語言中XML文件的讀寫操作

    Go語言中XML文件的讀寫操作

    本文主要介紹了Go語言中XML文件的讀寫操作,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 淺談golang結(jié)構(gòu)體偷懶初始化

    淺談golang結(jié)構(gòu)體偷懶初始化

    這篇文章主要介紹了淺談golang結(jié)構(gòu)體偷懶初始化,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 基于Go Int轉(zhuǎn)string幾種方式性能測試

    基于Go Int轉(zhuǎn)string幾種方式性能測試

    這篇文章主要介紹了Go Int轉(zhuǎn)string幾種方式測試,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04

最新評論