UDP协议
UDP协议(User Datagram Protocol)中文名称是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联)参考模型中一种无连接的传输层协议,不需要建立连接就能直接进行数据发送和接收,属于不可靠的、没有时序的通信,但是UDP协议的实时性比较好,通常用于视频直播相关领域。
UDP服务端
使用Go语言的net
包实现的UDP服务端代码如下:
package main
import (
"fmt"
"net"
)
// udp server demo
// udp_demo/server/main.go
func main() {
listen, err := net.ListenUDP("udp", &net.UDPAddr{
IP: net.IPv4(127, 0, 0, 1),
Port: 30000,
})
if err != nil {
fmt.Printf("listen failed,err:%v\n", err)
return
}
defer listen.Close()
for {
var buf [1024]byte
n, addr, err := listen.ReadFromUDP(buf[:]) // 接收数据
if err != nil {
fmt.Printf("read from udp failed,err:%v\n", err)
return
}
fmt.Println("接收到的数据:", string(buf[:n]))
_, err = listen.WriteToUDP(buf[:n], addr)
if err != nil {
fmt.Printf("write to %v failed,err:%v\n", addr, err)
return
}
}
}
UDP客户端
package main
import (
"bufio"
"fmt"
"net"
"os"
)
// udp client demo
// udp_demo/client/main.go
func main() {
c, err := net.DialUDP("udp", nil, &net.UDPAddr{
IP: net.IPv4(127, 0, 0, 1),
Port: 30000,
})
if err != nil {
fmt.Printf("dial dail,err:%v\n", err)
return
}
defer c.Close()
input := bufio.NewReader(os.Stdin)
for {
s, _ := input.ReadString('\n')
_, err = c.Write([]byte(s))
if err != nil {
fmt.Printf("send to server failed,err:%v\n", err)
return
}
// 接收数据
var buf [1024]byte
n, addr, err := c.ReadFromUDP(buf[:])
if err != nil {
fmt.Printf("recv from udp failed,err:%v\n", err)
return
}
fmt.Printf("read from %v,msg:%v\n", addr, string(buf[:n]))
}
}