You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

255 lines
5.4 KiB

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)
}