1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
| package main
import ( "fmt" "net" "time" )
type UDPAddr struct { IP []byte Port int }
var UDPServerLog = ` _ _ _____ _____ _____ | | | | __ \| __ \ / ____| | | | | | | | |__) | | (___ ___ _ ____ _____ _ __ | | | | | | | ___/ \___ \ / _ \ '__\ \ / / _ \ '__| | |__| | |__| | | ____) | __/ | \ V / __/ | \____/|_____/|_| |_____/ \___|_| \_/ \___|_| `
var Ip_port_Map = make(map[string]UDPAddr) var heartbeat = ""
func main() { fmt.Println(UDPServerLog) // 1. 设置接收数据IP端口 listen, err := net.ListenUDP("udp", &net.UDPAddr{ IP: net.IPv4(0, 0, 0, 0), Port: 8977, }) fmt.Println("[Server Start] IP: ", listen.LocalAddr()) if err != nil { fmt.Println("listen failed, err:", err) return } defer listen.Close()
// 1.1 心跳检测 go func() { for { timers_heartbeat := time.NewTimer(time.Minute) <-timers_heartbeat.C fmt.Println("发送心跳包:", Ip_port_Map) if len(Ip_port_Map) != 0 { for k, v := range Ip_port_Map { data := k + ":" + "AreYouOk" var addra *net.UDPAddr addra = &net.UDPAddr{IP: v.IP, Port: v.Port} _, err = listen.WriteToUDP([]byte(data), addra) if err != nil { fmt.Println("Write to udp failed, err: ", err) } // 休眠等待接收包 time.Sleep(500000000) if heartbeat != string(data[:6]) { delete(Ip_port_Map, string(data[:6])) fmt.Println(heartbeat, "用户不在线") } } } timers_heartbeat.Reset(1 * time.Second) } }()
// 主业务 for { var data [128]byte // 2. 接收数据 n, addr, err := listen.ReadFromUDP(data[:]) if err != nil { fmt.Println("read udp failed, err:", err) continue }
// 3. 新上线用户加入Map及移除下线用户 go func() { if string(data[7:13]) == "OnLine" { Ip_port_Map[string(data[:6])] = UDPAddr{IP: addr.IP, Port: addr.Port} } else if string(data[7:14]) == "OffLine" { delete(Ip_port_Map, string(data[:6])) fmt.Println("用户下线:", string(data[:6])) } else if string(data[7:11]) == "ImOK" { heartbeat = string(data[:6]) } }()
// 4. 收到数据发送OK go func() { data_OK := "OK" _, err = listen.WriteToUDP([]byte(data_OK), addr) if err != nil { fmt.Println("Write to udp failed, err: ", err) } }()
// 5. 群发数据 go func() { fmt.Println() fmt.Println("群发ing.....") for _, v := range Ip_port_Map { var addra *net.UDPAddr addra = &net.UDPAddr{IP: v.IP, Port: v.Port} _, err = listen.WriteToUDP([]byte(data[:n]), addra) if err != nil { fmt.Println("Write to udp failed, err: ", err) } } fmt.Println("群发结束.....") }()
fmt.Println("当前在线用户:", Ip_port_Map) fmt.Printf("数据:%v 地址:%v 字节长度:%v\n", string(data[:n]), addr, n) } }
|