LollipopGo遊戲伺服器架構--NetGateWay.go說明
大家好,我是彬哥,本節繼續給大家講解社群開源遊戲伺服器框架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
相關文章
- PetShop4.0 架構說明(轉載)架構
- RHEL 7特性說明(一):構架和限制
- 遊戲伺服器架構概要遊戲伺服器架構
- 汪子熙趣味成語接龍的遊戲軟體設計架構說明遊戲架構
- 遊戲伺服器的常用架構遊戲伺服器架構
- HP伺服器使用說明伺服器
- 經典遊戲伺服器端架構概述遊戲伺服器架構
- flowable 表結構說明
- 微機結構說明
- 『與善仁』Appium基礎 — 9、補充:C/S架構和B/S架構說明APP架構
- 遊戲架構 遊戲架構設計(8)遊戲架構
- 說說標準伺服器架構(WWW+Image/CSS/JS+File+DB)伺服器架構CSSJS
- DKhadoop框架結構說明Hadoop框架
- 加強堆結構說明
- Oracle 官方文件 結構說明Oracle
- Oracle官方文件結構說明Oracle
- 說說三層架構和MVC架構MVC
- 遊戲引擎架構遊戲引擎架構
- LollipopGo框架-鬥獸棋遊戲開發基本核心模組Go框架遊戲開發
- 程式碼的架構之說架構
- 【TABLESPACE】Oracle 表空間結構說明Oracle
- 說說面向服務的體系架構SOA架構
- 單體架構、微服務和無伺服器架構架構微服務伺服器
- 明確SOA中“A”——架構真正含義架構
- MMORPG伺服器架構伺服器架構
- 支付寶程式碼示例結構說明
- 架構之路(8):從CurrentUser說起架構
- 架構之路(八)從CurrentUser說起架構
- 細說五層網站架構網站架構
- 處理器核、Core、處理器、CPU區別&&指令集架構與微架構的區別&&32位與64位指令集架構說明架構
- SYSAUX 說明UX
- 使用說明
- 架構簡潔之道:從阿里開源應用架構 COLA 說起阿里應用架構
- 手動構造Qtum合約交易的說明QT
- Oracle DG(Data Guard)支援異構平臺說明Oracle
- ECshop 每個資料庫表結構說明資料庫
- Oracle Data Guard 支援的異構平臺 說明Oracle
- 【PG體系結構】PG體系結構簡單說明