心跳包介绍
定期发送HeartBeat协议包给服务器
服务器会移除超过1分钟没发数据包的网络会话
func (this *PlayerTaskMgr) timeAction() { if conf.ConfigMgr_GetMe().Global.Pystress != 0 { // 压力测试,方便测试客户端不发心跳包 return } nowTime := time.Now() var ptasks []*PlayerTask this.mutex.RLock() for _, t := range this.tasks { if nowTime.Sub(t.activeTime) > _TASK_MAX_TIMEOUT*time.Minute { ptasks = append(ptasks, t) } } this.mutex.RUnlock() for _, t := range ptasks { if !t.Stop() { this.Remove(t) } glog.Info("[玩家] 连接超时 ", t.id, ",", t.udata.Account, ",", t.key) } }公司的NAT设备也有超时关闭网络连接的安全措施
心跳包的背景
- 防止大量恶意的闲置悬挂连接,导致正常玩家无法登录或是大量浪费服务器资源
- 方便让客户端、服务器知道对方是否连接正常
RoomServer心跳包处理
就是简单的回发
func (this *PlayerTask) ParseMsg(data []byte, flag byte) bool {
// ... (无关代码略)
if cmd == usercmd.MsgTypeCmd_HeartBeat {
this.AsyncSend(data, flag)
return true
}
// ... (无关代码略)
return true
}
客户端对接心跳包
本项目要求,60s之内,如30秒定时发一次心跳包给RoomServer