示例#1
0
// 心跳机制
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)
	}
}