LollipopGo开源游戏服务器框架--网络基础模块源码

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

      大家好,我是彬哥,本节给大家讲下LollipopGo游戏服务器NetBase.go,抛砖引玉了,主要是针对Go语言游戏服务器网络处理。

package main

import (
    "encoding/json"
    "fmt"

    "Proto"
    "Proto/Proto2"

    "code.google.com/p/go.net/websocket"
)

func wwwGolangLtd(ws *websocket.Conn) {
    // fmt.Println("Golang语言社区 欢迎您!", ws)
    // data = json{}
    data := ws.Request().URL.Query().Get("data")
    fmt.Println("data:", data)
    NetDataConntmp := &NetDataConn{
        Connection:    ws,
        StrMd5:        "",
        MapSafe:       M,
        MapSafeServer: MServer,
    }
    NetDataConntmp.PullFromClient()
}

// 公用的send函数
func PlayerSendToServer(conn *websocket.Conn, data interface{}) {
    jsons, err := json.Marshal(data)
    if err != nil {
        fmt.Println("err:", err.Error())
        return
    }
    ///fmt.Println("jsons:", string(jsons))
    errq := websocket.Message.Send(conn, jsons)
    if errq != nil {
        fmt.Println(errq)
    }
    return
}

// 发送给客户端的数据信息函数
func (this *NetDataConn) PlayerSendMessage(senddata interface{}) {
    // 1 消息序列化 interface --->  json
    b, errjson := json.Marshal(senddata)
    if errjson != nil {
        fmt.Println(errjson.Error())
        return
    }
    // 数据转换 json的byte数组 --->  string
    data := "data:" + string(b[0:len(b)])
    fmt.Println(data)
    // 发送
    err := websocket.JSON.Send(this.Connection, b)
    if err != nil {
        fmt.Println(err.Error())
        return
    }
    return
}

// 群发广播函数:同一个房间
func PlayerSendBroadcastToRoomPlayer(iroomID int) {

    //  处理数据操纵
    // -------------------------------------------------------------------------
    for itr := M.Iterator(); itr.HasNext(); {
        k, v, _ := itr.Next()
        strsplit := Strings_Split(k.(string), "|")
        for i := 0; i < len(strsplit); i++ {
            if len(strsplit) < 2 {
                continue
            }

            if strsplit[2] == "room" {
                // 进行数据的查询类型
                switch v.(interface{}).(type) {
                case *NetDataConn:
                    { // 发送数据操作
                        data := &Proto2.C2S_PlayerAddGame{
                            Protocol:      Proto.GameNet_Proto,
                            Protocol2:     Proto2.Net_Kicking_PlayerProto2,
                            OpenID:        "1212334",
                            RoomID:        1,
                            PlayerHeadURL: "11",
                            Init_X:        13,
                            Init_Y:        10,
                        }
                        // 发送数据
                        v.(interface{}).(*NetDataConn).PlayerSendMessage(data)
                    }
                }
            }
        }
    }
    // -------------------------------------------------------------------------
}

// 推送给服务器
// 推送给 Global server key = Global_Server
// 几个小游戏的serverID
func (this *NetDataConn) SendServerDataFunc(StrMD5 string, ServerType string, Data interface{}) bool {

    strServerType := ServerType
    for itr := MServer.Iterator(); itr.HasNext(); {
        k, v, _ := itr.Next()
        var key = ""
        var keyName = ""
        strsplit := Strings_Split(k.(string), "|") // key = serverid| Global_Server
        if len(strsplit) == 2 {
            for i := 0; i < len(strsplit); i++ {
                if i == 0 {
                    key = strsplit[i]
                }
                // 获取链接的名字
                if i == len(strsplit)-1 {
                    keyName = strsplit[i]
                }
                if key == StrMD5 && keyName == strServerType {
                    // 发消息
                    v.(interface{}).(*NetDataConn).PlayerSendMessage(Data)
                    return true
                }
            }
        }
    }

    return false
}

// 发送给客户端
func (this *NetDataConn) SendClientDataFunc(StrMD5 string, ClientType string, Data interface{}) bool {

    fmt.Println("--------------------:", StrMD5)
    fmt.Println("--------------------:", ClientType)
    fmt.Println("--------------------:", Data)
    strClientType := ClientType
    for itr := M.Iterator(); itr.HasNext(); {
        k, v, _ := itr.Next()
        var key = ""
        var keyName = ""
        strsplit := Strings_Split(k.(string), "|") // key = serverid|connect
        if len(strsplit) == 2 {
            for i := 0; i < len(strsplit); i++ {
                if i == 0 {
                    key = strsplit[i]
                }
                // 获取链接的名字
                if i == len(strsplit)-1 {
                    keyName = strsplit[i]
                }
                if key == StrMD5 && keyName == strClientType {
                    // 发消息
                    v.(interface{}).(*NetDataConn).PlayerSendMessage(Data)
                    return true
                }
            }
        }
    }

    return false
}

// 推送格式
// 例子参考
func (this *NetDataConn) XC_Data_Send_AllPlayer_State(StrMD5 string, Data interface{}) bool {
    //发给手机
    for itr := M.Iterator(); itr.HasNext(); {
        k, v, _ := itr.Next()
        var key = ""
        var keyName = ""
        // 拆分key
        strsplit := Strings_Split(k.(string), "|") // key = openid|XCN|name
        if len(strsplit) == 2 {
            // 拆分
            for i := 0; i < len(strsplit); i++ {
                if i == 0 {
                    key = strsplit[i]
                }
                // 获取链接的名字
                if i == len(strsplit)-1 {
                    keyName = strsplit[i]
                }
                if key == StrMD5 && keyName == "connect" {
                    // 发消息
                    v.(interface{}).(*NetDataConn).PlayerSendMessage(Data)
                }
            }
        } else if len(strsplit) == 3 {
            // 拆分
            for i := 0; i < len(strsplit); i++ {
                if i == 1 {
                    key = strsplit[i]
                }
                // 获取链接的名字
                if i == len(strsplit)-1 {
                    keyName = strsplit[i]
                }
                if key == StrMD5 && keyName == "connect" {
                    // 发消息
                    v.(interface{}).(*NetDataConn).PlayerSendMessage(Data)
                }
            }
        }
    }

    return true
}


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


Golang语言社区

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

本文来自:简书

感谢作者:Golang语言社区

查看原文:LollipopGo开源游戏服务器框架--网络基础模块源码

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

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