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
相關文章
- 遊戲伺服器架構概要遊戲伺服器架構
- 遊戲伺服器的常用架構遊戲伺服器架構
- 汪子熙趣味成語接龍的遊戲軟體設計架構說明遊戲架構
- 遊戲架構 遊戲架構設計(8)遊戲架構
- 經典遊戲伺服器端架構概述遊戲伺服器架構
- LollipopGo框架-鬥獸棋遊戲開發基本核心模組Go框架遊戲開發
- 『與善仁』Appium基礎 — 9、補充:C/S架構和B/S架構說明APP架構
- 微機結構說明
- flowable 表結構說明
- DKhadoop框架結構說明Hadoop框架
- 阿里雲架構師解讀三大主流遊戲架構阿里架構遊戲
- 阿里雲架構師解讀四大主流遊戲架構阿里架構遊戲
- 【程式設計師的遊戲開發之路】 遊戲架構程式設計師遊戲開發架構
- 加強堆結構說明
- Oracle 官方文件 結構說明Oracle
- 戲說領域驅動設計(十三)——核心架構架構
- 戲說領域驅動設計(九)——架構模式架構模式
- 說說你對前端架構的理解前端架構
- GameFi鏈遊|卡牌|農民世界|沙盒遊戲開發詳情說明GAM遊戲開發
- 【TABLESPACE】Oracle 表空間結構說明Oracle
- 支付寶程式碼示例結構說明
- 程式碼的架構之說架構
- 關於FDF迴圈互助遊戲系統開發詳情說明遊戲
- 汪子熙趣味成語接龍的遊戲軟體使用文件說明遊戲
- 遊戲開發碩士專案說明會暨完美世界Open Day遊戲開發
- 說明
- 通過遊戲學習計算機架構 - embeddedartistry遊戲計算機架構Dart
- 透過遊戲學習計算機架構 - embeddedartistry遊戲計算機架構Dart
- 世界觀架構之射擊遊戲技能設定架構遊戲
- 單體架構、微服務和無伺服器架構架構微服務伺服器
- islandswap鏈遊系統開發(開發說明)丨islandswap鏈遊遊戲系統開發功能遊戲
- 元宇宙收藏養成類遊戲設計說明(邏輯及步驟)元宇宙遊戲設計
- 自己架設雲遊戲伺服器需要注意什麼?遊戲伺服器
- 無伺服器架構 - CodeCraft伺服器架構Raft
- 無伺服器Serverless是在經濟利益驅動下發明模式架構? -Grady伺服器Server模式架構
- 用Swoole來寫個聯機對戰遊戲呀!(二)單機遊戲架構遊戲架構
- 【Tomcat】Tomcat伺服器核心配置說明及標籤Tomcat伺服器
- 處理器核、Core、處理器、CPU區別&&指令集架構與微架構的區別&&32位與64位指令集架構說明架構