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

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

作者: Nimanggi | 来源:发表于2018-04-20 15:17 被阅读0次

    今回目- 网络通信

    网络游戏自然离不开网络通信,这也作为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 ---

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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/rjzakftx.html