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