golang⿇将服务器源码,LollipopGo开源游戏服务器框架--
global服务器源码
⼤家好,我是彬哥,本节给⼤家讲下LollipopGov1.0.20190102版本游戏服务器globla服务器,抛砖引⽟了,主要是针对Go语⾔游戏服务器Global服务器处理。
package main
import (
"LollipopGo/LollipopGo/conf"
"LollipopGo/LollipopGo/error"
"LollipopGo/LollipopGo/log"
"LollipopGo/LollipopGo/match"
"Proto"
"Proto/Proto2"
"flag"
"fmt"
"net/rpc"
"net/rpc/jsonrpc"
"strings"
"time"
"LollipopGo/LollipopGo/util"
"LollipopGo/ReadCSV"
"LollipopGo/LollipopGo/player"
"le/p/go/websocket"
)
/
*
匹配、活动服务器
1 匹配玩家活动
*/
var addrG = flag.String("addrG", "127.0.0.1:8888", "http service address")
var Conn *websocket.Conn
var ConnRPC *rpc.Client
func init() {
if !initGateWayNet() {
fmt.Println("链接 gateway server 失败!")
return
}
fmt.Println("链接 gateway server 成功!")
initNetRPC()
return
}
func initNetRPC() {
client, err := jsonrpc.Dial("tcp", service)
if err != nil {
log.Debug("dial error:", err)
//panic("dial RPC Servre error")
return
}
ConnRPC = client
}
func initGateWayNet() bool {
fmt.Println("⽤户客户端客户端模拟!")
url := "ws://" + *addrG + "/GolangLtd"源代码下载开源社区
conn, err := websocket.Dial(url, "", "test://golang/") if err != nil {
fmt.Println("err:", err.Error())
return false
}
Conn = conn
go GameServerReceiveG(Conn)
initConn(Conn)
return true
}
// 处理数据
func GameServerReceiveG(ws *websocket.Conn) { for {
var content string
err := websocket.Message.Receive(ws, &content) if err != nil {
fmt.Println(err.Error())
continue
}
fmt.Println(strings.Trim("", "\""))
fmt.Println(content)
content = strings.Replace(content, "\"", "", -1)
contentstr, errr := base64Decode([]byte(content))
if errr != nil {
fmt.Println(errr)
continue
}
go SyncMeassgeFunG(string(contentstr))
}
}
/
/ 链接分发 处理
func SyncMeassgeFunG(content string) {
var r Requestbody
if ProtocolData, err := r.Json2map(); err == nil {
HandleCltProtocolG(ProtocolData["Protocol"], ProtocolData["Protocol2"], ProtocolData)
} else {
log.Debug("解析失败:", err.Error())
}
}
// 主协议处理
func HandleCltProtocolG(protocol interface{}, protocol2 interface{}, ProtocolData map[string]interface{}) { // defer func() { // 必须要先声明defer,否则不能捕获到panic异常
// if err := recover(); err != nil {
// strerr := fmt.Sprintf("%s", err)
// //发消息给客户端
// ErrorST := Proto2.G_Error_All{
// Protocol: Proto.G_Error_Proto, // 主协议
// Protocol2: Proto2.G_Error_All_Proto, // ⼦协议
// ErrCode: "80006",
// ErrMsg: "亲,您发的数据的格式不对!" + strerr,
// // 发送给玩家数据
// fmt.Println("Global server的主协议!!!", ErrorST)
// }
// }()
// 协议处理
switch protocol {
case float64(Proto.G_GameGlobal_Proto):
{ // Global Server 主要协议处理
fmt.Println("Global server 主协议!!!")
HandleCltProtocol2Glogbal(protocol2, ProtocolData)
}
default:
panic("主协议:不存在!!!")
}
return
}
// ⼦协议的处理
func HandleCltProtocol2Glogbal(protocol2 interface{}, ProtocolData map[string]interface{}) { switch protocol2 {
case float64(Proto2.GW2G_ConnServerProto2):
{ // ⽹关返回数据
fmt.Println("gateway server 返回给global server 数据信息!!!")
}
case float64(Proto2.G2GW_PlayerEntryHallProto2):
{
G2GW_PlayerEntryHallProto2Fucn(Conn, ProtocolData)
}
case float64(Proto2.G2GW_PlayerMatchGameProto2):
{
fmt.Println("玩家请求玩家匹配!")
G2GW_PlayerMatchGameProto2Fucn(Conn, ProtocolData)
}
case float64(Proto2.GW2G_PlayerQuitMatchGameProto2):
fmt.Println("玩家主动退出匹配!")
G2GW_PlayerQuitMatchGameProto2Fucn(Conn, ProtocolData)
}
default:
panic("⼦协议:不存在!!!")
}
return
}
// 玩家主动退出匹配
func G2GW_PlayerQuitMatchGameProto2Fucn(conn *websocket.Conn, ProtocolData map[string]interface{}) { if ProtocolData["OpenID"] == nil {
panic("玩家主动退出匹配!")
return
}
StrOpenID := ProtocolData["OpenID"].(string)
// 玩家主动退出
match.SetQuitMatch(StrOpenID)
// 发送消息
data_send := &Proto2.G2GW_PlayerQuitMatchGame{
Protocol: Proto.G_GameGlobal_Proto,
Protocol2: Proto2.G2GW_PlayerQuitMatchGameProto2,
OpenID: StrOpenID,
ResultID: 0,
}
PlayerSendToServer(conn, data_send)
return
}
// 玩家匹配
func G2GW_PlayerMatchGameProto2Fucn(conn *websocket.Conn, ProtocolData map[string]interface{}) {
if ProtocolData["OpenID"] == nil ||
ProtocolData["RoomID"] == nil ||
ProtocolData["Itype"] == nil {
panic("选择游戏对战类型协议参数错误!")
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论