需求说明

本文通过一个购买物品的 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;
    }
});

运行效果