Golang实现UDP通信
众所周知,UDP是无连接的,所以并不保证数据的稳定性。我们实现代码中,往往会创造一个“伪连接”。来看一下服务端和客户端实现方式
UDP服务端
实现TCP服务端主是使用到net包里面的ListenUDP方法, 监听端口成功之后,(伪)连接就自动建立。
示例代码:
go
func main() {
addr := &net.UDPAddr{
IP: net.ParseIP("127.0.0.1"),
Port: 8080,
}
conn, err := net.ListenUDP("udp", addr)
if err != nil {
log.Fatal(err)
}
defer conn.Close()
println("udp server on: ", conn.LocalAddr().String())
for {
buffer := make([]byte, 1024)
n, err := conn.Read(buffer)
if err != nil {
log.Println(err)
}
println("接收到:", string(buffer[:n]))
}
}运行服务,发现输出:udp server on: 127.0.0.1:8080表示服务端监听UDP端口成功。
客户端我们可以使用nc工具来模拟。windows下系统没有自带nc工具,需要手动安装。地址:https://nmap.org/download.html
下载完,我们运行ncat -u 127.0.0.1 8080 来进行测试。(linux下使用nc -u 127.0.0.1 8080)
UDP客户端
TCP客户端主要实现只有一个方法net.DialUDP。通信成功之后,我们向服务端发送一段话。 示例代码:
go
func main() {
raddr := &net.UDPAddr{
IP: net.ParseIP("127.0.0.1"),
Port: 8080,
}
laddr := &net.UDPAddr{
IP: net.ParseIP("127.0.0.1"),
Port: 8081,
}
conn, err := net.DialUDP("udp", laddr, raddr)
if err != nil {
log.Fatal(err)
}
defer conn.Close()
println("udp client on: ", conn.LocalAddr().String())
messge := "server你好,我是client"
_, err = conn.Write([]byte(messge))
if err != nil {
log.Println(err)
}
}