package netProgram import ( "errors" "fmt" "io" "log" "net" "os" "time" ) func UDPClientBasic() { // 1.建立连接 raddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:9876") if err != nil { log.Fatalln(err) } udpConn, err := net.DialUDP("udp", nil, raddr) if err != nil { log.Fatalln(err) } log.Println(udpConn) // 2.写 data := []byte("Go UDP program") wn, err := udpConn.Write(data) // WriteToUDP(data, raddr) if err != nil { log.Fatalln(err) } log.Printf("send %s(%d) to %s\n", string(data), wn, raddr.String()) // 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()) } func UDPClientConnect() { // 1.建立连接 raddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:9876") if err != nil { log.Fatalln(err) } udpConn, err := net.DialUDP("udp", nil, raddr) if err != nil { log.Fatalln(err) } // 测试输出远程地址 log.Println(udpConn.RemoteAddr()) // 2.写 data := []byte("Go UDP program") wn, err := udpConn.Write(data) // WriteToUDP(data, raddr) //wn, err := udpConn.WriteToUDP(data, raddr) // WriteToUDP(data, raddr) if err != nil { log.Fatalln(err) } log.Printf("send %s(%d) to %s\n", string(data), wn, raddr.String()) // 测试输出远程地址 log.Println(udpConn.RemoteAddr()) // 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()) // 测试输出远程地址 log.Println(udpConn.RemoteAddr()) } func UDPClientPeer() { // 1.解析地址 laddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:6789") 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:9876") if err != nil { log.Fatalln(err) } // 2.写 data := []byte("Go UDP program") 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()) // 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()) } // 多播的发送端 func UDPSenderMulticast() { // 1.建立UDP多播组连接 address := "224.1.1.2:6789" raddr, err := net.ResolveUDPAddr("udp", address) if err != nil { log.Fatalln(err) } udpConn, err := net.DialUDP("udp", nil, raddr) if err != nil { log.Fatalln(err) } defer udpConn.Close() // 2.发送内容 // 循环发送 for { data := fmt.Sprintf("[%s]: %s", time.Now().Format("03:04:05.000"), "hello!") wn, err := udpConn.Write([]byte(data)) if err != nil { log.Println(err) } log.Printf("send \"%s\"(%d) to %s\n", data, wn, raddr.String()) time.Sleep(time.Second) } } // 广播发送端 func UDPSenderBroadcast() { // 1.监听地址 // 2.建立连接 laddr, err := net.ResolveUDPAddr("udp", ":9876") 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()) // 3.发送数据 // 广播地址 rAddress := "192.168.50.255:6789" raddr, err := net.ResolveUDPAddr("udp", rAddress) if err != nil { log.Fatalln(err) } for { data := fmt.Sprintf("[%s]: %s", time.Now().Format("03:04:05.000"), "hello!") // 广播发送 wn, err := udpConn.WriteToUDP([]byte(data), raddr) if err != nil { log.Println(err) } log.Printf("send \"%s\"(%d) to %s\n", data, wn, raddr.String()) time.Sleep(time.Second) } } // 文件传输(上传) func UDPFileClient() { // 1.获取文件信息 filename := "./data/Beyond.mp3" // 打开文件 file, err := os.Open(filename) if err != nil { log.Fatalln(err) } // 关闭文件 defer file.Close() // 获取文件信息 fileinfo, err := file.Stat() if err != nil { log.Fatalln(err) } //fileinfo.Size(), fileinfo.Name() log.Println("send file size:", fileinfo.Size()) // 2.连接服务器 raddress := "192.168.50.131:5678" raddr, err := net.ResolveUDPAddr("udp", raddress) if err != nil { log.Fatalln(err) } udpConn, err := net.DialUDP("udp", nil, raddr) if err != nil { log.Fatalln(err) } defer udpConn.Close() // 3.发送文件名 if _, err := udpConn.Write([]byte(fileinfo.Name())); err != nil { log.Fatalln(err) } // 4.服务端确认 buf := make([]byte, 4*1024) rn, err := udpConn.Read(buf) if err != nil { log.Fatalln(err) } // 判断是否为文件名正确接收响应 if "filename ok" != string(buf[:rn]) { log.Fatalln(errors.New("server not ready")) } // 5.发送文件内容 // 读取文件内容,利用连接发送到服务端 // file.Read() i := 0 for { // 读取文件内容 rn, err := file.Read(buf) if err != nil { // io.EOF 错误表示文件读取完毕 if err == io.EOF { break } log.Fatalln(err) } // 发送到服务端 if _, err := udpConn.Write(buf[:rn]); err != nil { log.Fatalln(err) } i++ } log.Println(i) // 文件发送完成。 log.Println("file send complete.") // 等待的测试 time.Sleep(2 * time.Second) }