Golang UDP服务的构建与优化指南

发表时间: 2024-06-07 10:30

tcp基于安全考虑有三次握手以及四次挥手, 但是会影响速度, 像直播这种平台就可以接受丢包, 可以选择UDP协议

服务端

udp_server/main.go

package mainimport ("fmt""net")func main() {    //step 1 监听服务器    listen, err := net.ListenUDP("udp", &net.UDPAddr{        IP: net.IPv4(0, 0, 0, 0),        Port: 9092,    })    if err != nil {        fmt.Printf("监听失败, err:%v\n", err)        return    }    //step 2 循环读取消息内容    for {        var data [1024]byte        n, addr, err := listen.ReadFromUDP(data[:])        if err != nil {            fmt.Printf("读取失败: %v, err: %v\n", addr, err)            break        }        go func() {            //todo sth            //step 3 回复数据            fmt.Printf("addr: %v data: %v count: %v\n", addr, string(data[:n]), n)            _, err = listen.WriteToUDP([]byte("接收成功!"), addr)            if err != nil {                fmt.Printf("写入失败, err: %v\n", err)            }        }()    }}

客户端

udp_client/main.go

package mainimport (    "fmt"    "net")func main() {    //step 1 连接服务器    conn, err := net.DialUDP("udp", nil, &net.UDPAddr{        IP: net.IPv4(127, 0, 0, 1),        Port: 9092,    })    if err != nil {        fmt.Printf("连接失败, err: %v\n", err)        return    }    for i := 0; i < 100; i++ {        //step 2 发送数据        _, err = conn.Write([]byte("hello server!"))        if err != nil {        fmt.Printf("发送数据失败, err : %v\n", err)        return    }    //step 3 接收数据    result := make([]byte, 1024)    n, remoteAddr, err := conn.ReadFromUDP(result)    if err != nil {        fmt.Printf("接收数据失败, err: %v\n", err)        return    }    fmt.Printf("receive from addr: %v data: %v\n", remoteAddr, string(result[:n]))    }}