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  }