github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/prepare/00_net/udp/example_2/main.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "github.com/AsynkronIT/goconsole" 6 "net" 7 "time" 8 ) 9 10 func read(conn *net.UDPConn) { 11 for { 12 data := make([]byte, 1024) 13 // 通过ListenUDP 返回的 conn 是 unconnected 需要 使用 ReadFromUDP 和 WriteToUDP 14 // 通过 DialUDP 返回的 conn 是 connected 需要 使用 Read 和 Write 15 n, remoteAddr, err := conn.ReadFromUDP(data) 16 if err != nil { 17 fmt.Printf("error during read: %s", err) 18 } 19 fmt.Printf("receive %s from <%s>\n", data[:n], remoteAddr) 20 } 21 } 22 func main() { 23 addr1 := &net.UDPAddr{IP: net.ParseIP("127.0.0.1"), Port: 9981} 24 addr2 := &net.UDPAddr{IP: net.ParseIP("127.0.0.1"), Port: 9982} 25 go func() { 26 listener1, err := net.ListenUDP("udp", addr1) 27 if err != nil { 28 fmt.Println(err) 29 return 30 } 31 go read(listener1) 32 time.Sleep(5 * time.Second) 33 listener1.WriteToUDP([]byte("ping to #2: "+addr2.String()), addr2) 34 }() 35 go func() { 36 listener1, err := net.ListenUDP("udp", addr2) 37 if err != nil { 38 fmt.Println(err) 39 return 40 } 41 go read(listener1) 42 time.Sleep(5 * time.Second) 43 listener1.WriteToUDP([]byte("ping to #1: "+addr1.String()), addr1) 44 }() 45 console.ReadLine() 46 }