心跳包介绍

  • 定期发送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

results matching ""

    No results matching ""