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

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

 更新時間:2022年07月25日 08:34:16   作者:奮斗的大橙子  
這篇文章介紹了Go語言實現(xiàn)UDP協(xié)議及TCP通訊的方法,文中通過示例代碼介紹的非常詳細。對大家的學(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é)尾,當連續(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)文章

  • graphql---go http請求使用詳解

    graphql---go http請求使用詳解

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

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

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

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

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

    深入探索Go?1.21中的?maps工具庫

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

    Golang實踐指南之獲取目錄文件列表

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

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

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

    Go語言基礎(chǔ)知識點介紹

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

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

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

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

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

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

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

最新評論