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.

230 lines
4.8 KiB

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