阅读量:
Go UDP 编程
CS 模型
Server:
package main
import (
"fmt"
"net"
)
func main() {
listen, err := net.ListenUDP("udp", &net.UDPAddr{IP: net.ParseIP("127.0.0.1"), Port: 12345})
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("Local: <%s> \n", listen.LocalAddr().String())
data := make([]byte, 1024)
for {
n, remoteAddr, err := listen.ReadFromUDP(data)
if err != nil {
fmt.Printf("error during read: %s", err)
}
fmt.Printf("<%s> %s\n", remoteAddr, data[:n])
_, err = listen.WriteToUDP([]byte("world"), remoteAddr)
if err != nil {
fmt.Printf(err.Error())
}
}
}
Client:
package main
import (
"fmt"
"net"
)
func main() {
dstAddr := &net.UDPAddr{IP: net.ParseIP("127.0.0.1"), Port: 12345}
conn, err := net.DialUDP("udp", nil, dstAddr)
if err != nil {
fmt.Println(err)
}
defer conn.Close()
conn.Write([]byte("hello"))
fmt.Printf("<%s>\n", conn.RemoteAddr())
}
等价节点
由于 UDP socket 是一个二元组,因为我们可以监听本地套接字,因此可以接收任意地址来的包,也可以向任意地址发包。
双端都监听本地套接字,并接收任意地址的包,因此双端此时都是一个等价的节点。
package main
import (
"fmt"
"net"
)
func main() {
listen, err := net.ListenUDP("udp", &net.UDPAddr{IP: net.ParseIP("127.0.0.1"), Port: 12345})
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("Local: <%s> \n", listen.LocalAddr().String())
data := make([]byte, 1024)
for {
n, remoteAddr, err := listen.ReadFromUDP(data)
if err != nil {
fmt.Printf("error during read: %s", err)
}
fmt.Printf("<%s> %s\n", remoteAddr, data[:n])
_, err = listen.WriteToUDP([]byte("world"), remoteAddr)
if err != nil {
fmt.Printf(err.Error())
}
}
}