需求说明

本文通过一个购买物品的 demo,演示如何在 pomelo 中新建服务类型。请求链路如下:

客户端 --> 前端(connector) --> 后端(game)

服务端实现

前端 connector:entryHandler

在 pomelo 前端 connector 中新建 connector.entryHandler.js,负责维护客户端的 session,包括建立绑定等操作。玩家连接成功后,服务器返回一个成功字段,并为其分配 session,uid 取自客户端传入的名字。

module.exports = function(app) {
                  return new Handler(app);
                };
                
                var Handler = function(app) {
                  this.app = app;
                };
                
                /**
                 * New client entry.
                 *
                 * @param  {Object}   msg     request message
                 * @param  {Object}   session current session object
                 * @param  {Function} next    next step callback
                 * @return {Void}
                 */
                Handler.prototype.entry = function(msg, session, next) {
                //  next(null, {code: 200, msg: 'game server is ok.'});
                
                var uid= msg.name;
                
                session.bind(uid);
                session.pushAll();
                
                session.on("closed" , function(){
                	console.log("玩家"+ session.uid + "断开了链接");
                })
                
                next(null,"链接成功");
                
                };

后端 game:gameHandler

pomelo 后端 game 服务负责具体的购买逻辑。需要注意的是,该服务不可直接与客户端通讯——客户端的 pomelo.init 无法直接连接到后端服务器 game。新建文件 game/handler/gameHandler.js:

module.exports = function(app) {
                	return new Handler(app);
                };
                
                var Handler = function(app) {
                	this.app = app;
                };
                var handler=Handler.prototype;
                
                handler. getNotify = function(msg, session, next) {
                //console.log(msg)
                //console.log(session)
                
                
                	next(null, {msg:"欢迎玩家" + msg.name + "进入游戏"});
                
                };
                
                
                
                handler.buyGoods=function(msg,session,next){
                	var id=msg.id;
                	var count = msg.count;
                	console.log("购买物品玩家 uid:" + session.uid);
                
                	if(id == "100" &&  count ==1){
                		next(null,{msg:"购买物品:#活血丹 成功",code:200}); // 返回客户端
                	}else{
                				next(null,{msg:"你的金币不足,购买失败",code:200}); // 返回客户端调用
                	}
                
                }
                //客户端通过pomelo.request("game.gameHandler.buyGoods",{id:"100",count:1},function(data){
                //来发起此请求

配置文件

需要在 pomelo 的配置文件中注册 connector 和 game 两种服务类型:

servers.json // 配置
                
                {
                  "development":{
                    "connector": [
                    {"id": "connector-server-1", "host": "127.0.0.1", "port": 3150, "clientHost": "127.0.0.1", "clientPort": 3010, "frontend": true}
                    ],
                
                
                  "game": [
                    {"id": "game-server-1", "host": "127.0.0.1", "port": 8000}
                
                  ]
                
                  },
                
                  "production":{
                    "connector": [
                    { "id": "connector-server-1", "host": "127.0.0.1", "port": 3150, "clientHost": "127.0.0.1", "clientPort": 3010, "frontend": true}],
                  "game": [{"id": "game-server-1", "host": "127.0.0.1", "port": 8000}]
                
                
                  }
                }
                
                adminServer.json// 配置
                
                [{
                    "type": "connector",
                    "token": "agarxhqb98rpajloaxn34ga8xrunpagkjwlaw3ruxnpaagl29w4rxn"
                }
                ,
                
                
                {
                    "type": "game",
                    "token": "agarxhqb98rpajloaxn34ga8xrunpagkjwlaw3ruxnpaagl29w4rxn"
                }
                ]

客户端实现

客户端使用 Cocos2d-JS 框架,先通过 pomelo.init 连接前端 connector,然后通过路由请求后端 game 服务完成购买操作:

var HelloWorldLayer = cc.Layer.extend({
                    sprite:null,
                    ctor:function () {
                        //////////////////////////////
                        // 1. super init first
                        this._super();
                
                        /////////////////////////////
                        // 2. add a menu item with "X" image, which is clicked to quit the program
                        //    you may modify it.
                        // ask the window size
                        var size = cc.winSize;
                
                        // add a "close" icon to exit the progress. it's an autorelease object
                        var closeItem = new cc.MenuItemImage(
                            res.CloseNormal_png,
                            res.CloseSelected_png,
                            function () {
                
                //////////////////////////////////////////////////////////
                ///购买物品
                            	var route= "game.gameHandler.buyGoods";
                
                            	pomelo.request(route,{id:"100",count:1},function(data){
                
                            		cc.log("购买物品:" + JSON.stringify(data));
                /////////////////////////////////////////////////////////////////
                            	})
                
                            }, this);
                        closeItem.attr({
                            x: size.width - 20,
                            y: 20,
                            anchorX: 0.5,
                            anchorY: 0.5
                        });
                
                        var menu = new cc.Menu(closeItem);
                        menu.x = 0;
                        menu.y = 0;
                        this.addChild(menu, 1);
                
                
                        ////////////////////////////////////////////////////////////////////////////
                         pomelo=window.pomelo;
                
                
                
                        pomelo.init({/// 连接前端 connector
                        	host: "127.0.0.1",
                        	port: 3010,
                        	log: true
                        }, function () {
                
                        	var route = "connector.entryHandler.entry";
                        	//var route = "game.gameHandler.getNotify";
                
                        			pomelo.request(route, {name:"test"}, function (data) {
                        				//链接connector成功
                        				cc.log("[client.js]:" + JSON.stringify(data));
                
                
                        					var route = "game.gameHandler.getNotify";
                
                        					pomelo.request(route, {name:"test"}, function (data) {
                        						//测试后端服务器
                        						cc.log("[client.js]:" + JSON.stringify(data));
                        					});
                        			});
                        		});
                        pomelo.on("disconnect",function(){
                        	cc.log("和服务器断开连接");
                        })
                /////////////////////////////////////////////////////////////////////////////////////////////
                        return true;
                    }
                });

运行效果