Server
package main
import (
"fmt"
"net"
"time"
)
func handle(conn net.UDPConn) {
defer conn.Close()
buff:= make([]byte,4096)
for{
n,udpAddr,err2:=conn.ReadFromUDP(buff)//udpAddr是客户端的地址结构
if err2!=nil{
fmt.Println("read data err",err2)
}
fmt.Println("读到数据",udpAddr,string(buff[:n]))
conn.WriteToUDP(buff[:n],udpAddr)
}
}
func main() {
//serberladdr是地址结构,不是socket不用关闭,注意TCP是3个socket,需要关闭
serverladdr,err:=net.ResolveUDPAddr("udp","127.0.0.1:8001")
if err!= nil{
fmt.Println("创建udp服务器的地址结构出错",err)
return
}
fmt.Println("udp服务器地址结构返回正确")
conn,err:=net.ListenUDP("udp",serverladdr)
if err!=nil{
fmt.Println("创建udp的socket出错")
return
}
defer conn.Close()
fmt.Println("服务器的通信socket创建完成")
go handle(*conn)
time.Sleep(100*time.Second)
}
Clinet
package main
import (
"fmt"
"net"
"os"
)
func main() {
conn,err:=net.Dial("udp","127.0.0.1:8001")
if err!=nil{
fmt.Println("net.Dial err",err)
return
}
defer conn.Close()
fmt.Println("net.Dial success")
go func(){
buff := make([]byte,4096)
//一直监听从键盘读数据
for{
n,err:=os.Stdin.Read(buff)
if err!=nil{
fmt.Println("stdin err",err)
continue
}
//将数据发送到服务端
conn.Write(buff[:n])
}
}()
//从服务器端接收数据
for{
buffer := make([]byte,4096)
n,err:=conn.Read(buffer)
if err!=nil{
fmt.Println("conn read err",err)
return
}
if n==0{
fmt.Println("检测到服务器端已经关闭,关闭链接")
}
fmt.Println(string(buffer[:n]))
}
}