Mac环境下Leaf框架游戏服务器开发(二)- 网络通信

2018-04-20  本文已影响0人  Nimanggi

今回目- 网络通信

网络游戏自然离不开网络通信,这也作为Leaf的一个重要组成部分和消息通信机制紧密结合在一起。

首先要说的是,Leaf的通信地址和端口都配置在服务器工程的bin/conf/server.json 文件中
类似如下:

{
    "LogLevel": "debug",
    "LogPath": "",
    "TCPAddr": "127.0.0.1:3563",
    "WSAddr": "127.0.0.1:3653",
    "MaxConnNum": 20000
}

这里配置了TCP和WebSocket的通信地址,均为“127.0.0.1:3563”,其他的不用废话大家也能看得懂。
这里有一个好处,就是不管客户端用标准Socket TCP的连接方式还是WebSocket的连接方式,服务端的代码是一样的,不需要因为通信方式的改变而修改代码,这里当然是因为Leaf给封装好了,所以客户端随便得瑟。

剩下的就是客户端和服务器消息的接/发,这里找个最简单的逻辑,举个🌰。

  1. 服务器:
    跟一个简单消息有关的代码文件


    image.png

1.1 msg.go文件中添加一个消息结构

func handleSignIn(args []interface{}) {

    content := args[0].(*msg.SignIn)
    requestor := args[1].(gate.Agent)

    // 输出收到的消息的内容
    log.Debug("Msg SignIn %v", content.Username)
    log.Debug("Msg SignIn %v", content.Password)

    requestor.WriteMsg(&msg.Hello{
        Name: "iron man",
    })
}

1.2 并在init()方法中注册这个消息。

func init() {
    handler(&msg.SignIn{}, handleSignIn)
}

1.3 在router.go文件的init()方法中,指定刚才注册的消息要被哪个模块接收处理。

func init() {
    msg.Processor.SetRouter(&msg.SignIn{}, game.ChanRPC)
}

注意:模块间使用的是ChanRPC通讯

最后, 在指定模块下的handler.go文件进行消息逻辑的处理。
1.4 实现处理函数


func handleSignIn(args []interface{}) {

    content := args[0].(*msg.SignIn)
    requestor := args[1].(gate.Agent)

    // 输出收到的消息的内容
    log.Debug("Msg SignIn %v", content.Username)
    log.Debug("Msg SignIn %v", content.Password)

    requestor.WriteMsg(&msg.Hello{
        Name: "iron man",
    })
}

1.5 init中注册处理函数

func init() {
    handler(&msg.SignIn{}, handleSignIn)
}
  1. 客户端
    这里客户端用的是Cocos Creator 1.9.1版本, JS脚本开发, websocket连接

不用废话,直接上代码,非常好理解。

// 用户登录
    signIn: function (event, customEventData) {
        cc.log("func: signIn")

        var username = this.usernameEditbox.string;
        var password = this.passwordEditbox.string;

        cc.log("username = " + username);
        cc.log("password = " + password);

        var ws = new WebSocket("ws://127.0.0.1:3653");
        ws.onopen = function (event) {
            ws.send(JSON.stringify({SignIn: {
                Username: username,
                Password: password
            }}))
        };
        ws.onmessage = function (event) {


        if(typeof(event.data)=="string")            //服务器传过来的可能是字符串,判断是不是

        {

            cc.log("typeof(event.data)");

        }

        else

        {


            console.log("response text msg: " + event.data);

            var buffer = event.data;

            var msgS =  String.fromCharCode.apply(null, new Uint8Array(buffer));

            var msgJ = JSON.parse(msgS);

            // {"Hello":{"Name":"iron man"}}

            console.log("5555 = " + msgJ.Hello.Name);  //iron man

  

        }

        };
        ws.onerror = function (event) {
            console.log("Send Text fired an error");
        };
        ws.onclose = function (event) {
            console.log("WebSocket instance closed.");
        };
       
        setTimeout(function () {
            if (ws.readyState === WebSocket.OPEN) {
                ws.send("Hello WebSocket, I'm a text message.");
            }
            else {
                console.log("WebSocket instance wasn't ready...");
            }
        }, 3);
    },

--- To Be Continued ---

【喜欢的点个赞,用得上的打个赏,拿钱去买猫粮。楼下的流浪猫在等我。】

上一篇下一篇

猜你喜欢

热点阅读