LollipopGo遊戲伺服器架構--NetGateWay.go說明

weixin_34006468發表於2018-12-26

大家好,我是彬哥,本節繼續給大家講解社群開源遊戲伺服器框架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


7059927-6b4f6fae486a718c.png
Golang語言社群

相關文章