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