LollipopGo游戏服务器架构--NetGateWay.go说明

Golang语言社区 · · 681 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

大家好,我是彬,本节继续给大家讲解社区开源游戏服务器框架LollipopGo的说明。

本节着重给大家讲解的是NetGateWay.go,核心内容是针对网关的消息处理机制,直接先上代码 如下:

package main

import (
    "LollipopGo/LollipopGo/log"
    "LollipopGo/LollipopGo/util"
    "Proto"
    "Proto/Proto2"
    "fmt"
)

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Global Server 子协议的处理
func (this *NetDataConn) HandleCltProtocol2GL(protocol2 interface{}, ProtocolData map[string]interface{}) {

    switch protocol2 {
    case float64(Proto2.G2GW_ConnServerProto2):
        {
            // 网关主动链接进来,做数据链接的保存
            this.GLConnServerFunc(ProtocolData)
        }
    case float64(Proto2.GW2G_PlayerEntryHallProto2):
        {
            // Global server 返回给服务器
            this.GWPlayerLoginGL(ProtocolData)
        }
    default:
        panic("子协议:不存在!!!")
    }

    return
}

// Global server 返回给gateway server
func (this *NetDataConn) GWPlayerLoginGL(ProtocolData map[string]interface{}) {

    if ProtocolData["OpenID"] == nil {
        log.Debug("Global server data is wrong:OpenID is nil!")
        return
    }

    StrOpenID := ProtocolData["OpenID"].(string)
    StrPlayerName := ProtocolData["PlayerName"].(string)
    StrHeadUrl := ProtocolData["HeadUrl"].(string)
    StrConstellation := ProtocolData["Constellation"].(string)
    StrSex := ProtocolData["Sex"].(string)
    StGamePlayerNum := ProtocolData["GamePlayerNum"].(map[string]interface{})

    StRacePlayerNum := make(map[string]interface{})
    if ProtocolData["RacePlayerNum"] != nil {
        StRacePlayerNum = ProtocolData["RacePlayerNum"].(map[string]interface{})
    }
    StPersonal := ProtocolData["Personal"].(map[string]interface{})
    // StDefaultMsg := ProtocolData["DefaultMsg"].(map[string]*player.MsgST)
    // StDefaultMsg := ProtocolData["DefaultMsg"].(map[string]*player.MsgST)
    // StDefaultAward := ProtocolData["DefaultAward"].(map[string]interface{})

    // 发给客户端模拟
    data := &Proto2.S2GWS_PlayerLogin{
        Protocol:      6,
        Protocol2:     2,
        PlayerName:    StrPlayerName,
        HeadUrl:       StrHeadUrl,
        Constellation: StrConstellation,
        Sex:           StrSex,
        OpenID:        StrOpenID,
        GamePlayerNum: StGamePlayerNum,
        RacePlayerNum: StRacePlayerNum,
        Personal:      StPersonal,
        // DefaultMsg:    StDefaultMsg,
        // DefaultAward:  StDefaultAward,
    }
    // 发送数据  --
    this.SendClientDataFunc(data.OpenID, "connect", data)
    return
}

// Global server 保存
func (this *NetDataConn) GLConnServerFunc(ProtocolData map[string]interface{}) {
    if ProtocolData["ServerID"] == nil {
        panic("ServerID 数据为空!")
        return
    }

    fmt.Println("Global server conn entry gateway!!!")

    // Globla server 发过来的可以加密的数据
    StrServerID := ProtocolData["ServerID"].(string)
    strGlobalServer = StrServerID
    // 1 发送数据
    data := &Proto2.GW2G_ConnServer{
        Protocol:  9,
        Protocol2: 2,
        ServerID:  StrServerID,
    }
    // 发送数据
    this.PlayerSendMessage(data)

    // 2 保存Global的链接信息
    //================================推送消息处理===================================
    // 保存在线的玩家的数据信息
    onlineServer := &NetDataConn{
        Connection:    this.Connection, // 链接的数据信息
        MapSafeServer: this.MapSafeServer,
    }
    // 保存玩家数据到内存
    this.MapSafeServer.Put(StrServerID+"|Global_Server", onlineServer)
    //==============================================================================
    return
}

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------

// client 子协议的处理
func (this *NetDataConn) HandleCltProtocol2GW(protocol2 interface{}, ProtocolData map[string]interface{}) {

    switch protocol2 {
    case float64(Proto2.C2GWS_PlayerLoginProto2):
        {
            // 功能函数处理 --  用户登陆协议
            this.GWPlayerLogin(ProtocolData)
        }
    case float64(Proto2.GateWay_HeartBeatProto2):
        {
            // 功能函数处理 --  心跳函数处理
            this.GWHeartBeat(ProtocolData)
        }
    default:
        panic("子协议:不存在!!!")
    }

    return
}

func (this *NetDataConn) GWHeartBeat(ProtocolData map[string]interface{}) {
    if ProtocolData["OpenID"] == nil {
        panic("心跳协议参数错误!")
        return
    }

    StrOpenID := ProtocolData["OpenID"].(string)
    // 将我们解析的数据 --> token --->  redis 验证等等
    // 主要看TTL的时间是否正确
    data := &Proto2.GateWay_HeartBeat{
        Protocol:  6,
        Protocol2: 3,
        OpenID:    StrOpenID,
    }
    // 发送数据
    this.PlayerSendMessage(data)
    return
}

func (this *NetDataConn) GWPlayerLogin(ProtocolData map[string]interface{}) {
    if ProtocolData["Token"] == nil ||
        ProtocolData["PlayerUID"] == nil {
        panic("网关登陆协议错误!!!")
        return
    }

    StrPlayerUID := ProtocolData["PlayerUID"].(string)
    StrPlayerName := ProtocolData["PlayerName"].(string)
    StrHeadUrl := ProtocolData["HeadUrl"].(string)
    StrConstellation := ProtocolData["Constellation"].(string)
    StrPlayerSchool := ProtocolData["PlayerSchool"].(string)
    StrSex := ProtocolData["Sex"].(string)
    StrToken := ProtocolData["Token"].(string)

    // 1 将我们解析的数据 --> token --->  redis 验证等等
    // 主要看TTL的时间是否正确
    // 2 发送给Global server 获取数据  在线人数等
    data := &Proto2.G2GW_PlayerEntryHall{
        Protocol:      Proto.G_GameGlobal_Proto,
        Protocol2:     Proto2.G2GW_PlayerEntryHallProto2,
        OpenID:        util.MD5_LollipopGO(StrPlayerUID + "GateWay"),
        PlayerName:    StrPlayerName,
        HeadUrl:       StrHeadUrl,
        Constellation: StrConstellation,
        PlayerSchool:  StrPlayerSchool,
        Sex:           StrSex,
        Token:         StrToken,
    }
    this.SendServerDataFunc(strGlobalServer, "Global_Server", data)

    // 发给客户端模拟
    // data := &Proto2.S2GWS_PlayerLogin{
    //  Protocol:  6,
    //  Protocol2: 2,
    //  OpenID:    util.MD5_LollipopGO(StrPlayerUID + "GateWay"),
    // }
    // 发送数据
    // this.PlayerSendMessage(data)
    // 保存玩家数据到内存 M
    //================================推送消息处理===================================
    // 保存在线的玩家的数据信息
    onlineUser := &NetDataConn{
        Connection: this.Connection, // 链接的数据信息
        MapSafe:    this.MapSafe,
    }
    // 保存玩家数据到内存
    this.MapSafe.Put(data.OpenID+"|connect", onlineUser)
    //==============================================================================

    return
}

LollipopGo游戏服务器地址:
https://github.com/Golangltd/LollipopGo
社区视频课程课件GIT地址:
https://github.com/Golangltd/codeclass
Golang语言社区论坛 :
www.Golang.Ltd


Golang语言社区

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:Golang语言社区

查看原文:LollipopGo游戏服务器架构--NetGateWay.go说明

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

681 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传