// 心跳机制 func heartBeat(clientObj *client.Client, loginSucceedCh chan int) { // 处理内部未处理的异常,以免导致主线程退出,从而导致系统崩溃 defer func() { if r := recover(); r != nil { logUtil.Log(fmt.Sprintf("通过recover捕捉到的未处理异常:%v", r), logUtil.Error, true) } }() // 先等待登陆成功 <-loginSucceedCh // 将客户端标记为已经登陆 ClientList[clientObj.Id] = true // 随机暂停一段时间 time.Sleep(time.Duration(mathUtil.GetRandInt(60)) * time.Second) // 用于标记是发送心跳包,还是内容 count := 3 for { count++ // 每发送4次心跳包,然后发一次包含内容的消息 if count%4 == 0 { // 将count重置为0 count = 0 // 发送数据 requestMap := make(map[string]interface{}) requestMap = assembleMessageParam(requestMap, "Y") request(clientObj, requestMap) } else { clientObj.SendHeartBeatMessage() } // 休眠随机时间(单位:秒) time.Sleep(HeartBeatInterval * time.Second) } }