package netProgram import ( "log" "net" "os" ) func UDPServerBasic() { // 1.解析地址 laddr, err := net.ResolveUDPAddr("udp", ":9876") if err != nil { log.Fatalln(err) } // 2.监听 udpConn, err := net.ListenUDP("udp", laddr) if err != nil { log.Fatalln(err) } log.Printf("%s server is listening on %s\n", "UDP", udpConn.LocalAddr().String()) defer udpConn.Close() // 3.读 buf := make([]byte, 1024) rn, raddr, err := udpConn.ReadFromUDP(buf) if err != nil { log.Fatalln(err) } log.Printf("received %s from %s\n", string(buf[:rn]), raddr.String()) // 4.写 data := []byte("received:" + string(buf[:rn])) wn, err := udpConn.WriteToUDP(data, raddr) if err != nil { log.Fatalln(err) } log.Printf("send %s(%d) to %s\n", string(data), wn, raddr.String()) } func UDPServerConnect() { // 1.解析地址 laddr, err := net.ResolveUDPAddr("udp", ":9876") if err != nil { log.Fatalln(err) } // 2.监听 udpConn, err := net.ListenUDP("udp", laddr) if err != nil { log.Fatalln(err) } log.Printf("%s server is listening on %s\n", "UDP", udpConn.LocalAddr().String()) defer udpConn.Close() // 测试输出远程地址 log.Println(udpConn.RemoteAddr()) // 3.读 buf := make([]byte, 1024) rn, raddr, err := udpConn.ReadFromUDP(buf) //rn, err := udpConn.Read(buf) if err != nil { log.Fatalln(err) } log.Printf("received %s from %s\n", string(buf[:rn]), raddr.String()) // 测试输出远程地址 log.Println(udpConn.RemoteAddr()) // 4.写 data := []byte("received:" + string(buf[:rn])) wn, err := udpConn.WriteToUDP(data, raddr) //wn, err := udpConn.Write(data) if err != nil { log.Fatalln(err) } log.Printf("send %s(%d) to %s\n", string(data), wn, raddr.String()) // 测试输出远程地址 log.Println(udpConn.RemoteAddr()) } func UDPServerPeer() { // 1.解析地址 laddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:9876") if err != nil { log.Fatalln(err) } // 2.监听 udpConn, err := net.ListenUDP("udp", laddr) if err != nil { log.Fatalln(err) } log.Printf("%s server is listening on %s\n", "UDP", udpConn.LocalAddr().String()) defer udpConn.Close() // 远程地址 raddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:6789") if err != nil { log.Fatalln(err) } // 3.读 buf := make([]byte, 1024) rn, raddr, err := udpConn.ReadFromUDP(buf) if err != nil { log.Fatalln(err) } log.Printf("received %s from %s\n", string(buf[:rn]), raddr.String()) // 4.写 data := []byte("received:" + string(buf[:rn])) wn, err := udpConn.WriteToUDP(data, raddr) if err != nil { log.Fatalln(err) } log.Printf("send %s(%d) to %s\n", string(data), wn, raddr.String()) } // 多播接收端 func UDPReceiverMulticast() { // 1.多播监听地址 address := "224.1.1.2:6789" gaddr, err := net.ResolveUDPAddr("udp", address) if err != nil { log.Fatalln(err) } // 2.多播监听 udpConn, err := net.ListenMulticastUDP("udp", nil, gaddr) if err != nil { log.Fatalln(err) } // 3.接受数据 // 循环接收 buf := make([]byte, 1024) for { rn, raddr, err := udpConn.ReadFromUDP(buf) if err != nil { log.Println(err) } log.Printf("received \"%s\" from %s\n", string(buf[:rn]), raddr.String()) } } // 广播接收端 func UDPReceiverBroadcast() { // 1.广播监听地址 laddr, err := net.ResolveUDPAddr("udp", ":6789") if err != nil { log.Fatalln(err) } // 2.广播监听 udpConn, err := net.ListenUDP("udp", laddr) if err != nil { log.Fatalln(err) } defer udpConn.Close() log.Printf("%s server is listening on %s\n", "UDP", udpConn.LocalAddr().String()) // 3.接收数据 // 4.处理数据 buf := make([]byte, 1024) for { rn, raddr, err := udpConn.ReadFromUDP(buf) if err != nil { log.Println(err) } log.Printf("received \"%s\" from %s\n", string(buf[:rn]), raddr.String()) } } // UDP文件传输 func UDPFileServer() { // 1.建立UDP连接 laddress := ":5678" laddr, err := net.ResolveUDPAddr("udp", laddress) if err != nil { log.Fatalln(err) } udpConn, err := net.ListenUDP("udp", laddr) if err != nil { log.Fatalln(err) } defer udpConn.Close() log.Printf("%s server is listening on %s\n", "UDP", udpConn.LocalAddr().String()) // 2.接收文件名,并确认 buf := make([]byte, 4*1024) rn, raddr, err := udpConn.ReadFromUDP(buf) if err != nil { log.Fatalln(err) } filename := string(buf[:rn]) if _, err := udpConn.WriteToUDP([]byte("filename ok"), raddr); err != nil { log.Fatalln(err) } // 3.接收文件内容,并写入文件 // 打开文件(创建) file, err := os.Create(filename) if err != nil { log.Fatalln(err) } defer file.Close() // 网络读取 i := 0 for { // 一次读取 rn, _, err := udpConn.ReadFromUDP(buf) if err != nil { log.Fatalln(err) } // 写入文件 if _, err := file.Write(buf[:rn]); err != nil { log.Fatalln(err) } i++ log.Println("file write some content", i) } }