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])) }}