您的位置:首页 > 其它

pomelo 学习零碎记录 4

2012-12-08 20:24 519 查看
handler的接口:

---------------------------------------------

module.exports = function(app) {

return new Handler(app);

};

var Handler = function(app) {

this.app = app;

};

var handler = Handler.prototype;

handler.method = fuction(msg, session, next)

{

//每个连接都会自动生成一个session,可供记录连接会话的数据 并把当前的socket对象保存其中

//前端服务器的session类型是MockLocalSession 后端服务器session的类型是LocalSession,他们都是全局session的副本

//可以通过副本session的bind方法将指定的uid绑定到sessionService的uidMap中,绑定之后可以通过sessionService.getBuUid获取全局session

//副本session可以调用set方法设置保存键值对,但要同步到全局session必须调用push方法例如session.set('rid', rid);session.push('rid', function(err){});

var c = msg.a + msg.b;

var resp = {result : c };

next(null, resp); //resp是返回给客户端的数据

}

--------------------------------------------

客户端调用:

--------------------------------------------

var route = "服务器类型.文件名.方法名";

var cb = function(data){ var result = data.result } //cb将处理服务器返回的数据

pomelo.request(route, {a:1, b:2}, cb);

--------------------------------------------

客户端可以调用前端服务器和后端服务器的hanlder,

调用前端服务器hanlder数据流:

客户端{ pomelo.request -> soket.send } -> 前端服务器{ [pomelo.connectors.siosocket.js] -> [pomelo.lib.components.connector.js] ->[server.js] -> [pomelo.lib.server.server.js] doHandle -> 目标hanlder -> [pomelo.lib.components.connector.js] component.session.sendMessage -> [pomelo.lib.common.service.sessionService.js]session.__socket__.send } -> 客户端{ [pomeloclient.js]processMessage }

最后客户端根据发送前设定的消息id调用相应request回调

调用后端服务器hanlder:

实际上是先连接到前端服务器,在pomelo/lib.server/server.js中执行

app.sysrpc[routeRecord.serverType].msgRemote.forwardMessage

通过rpc调用后端服务器的forwardMessage方法(pomelo/lib/common/remote/backend/msgRemote.js),在后端服务器的forwardMessage方法中重新调用后端服务器的server.handle方法以调用客户端的目标hanlder.

------------------------------------------------------

remote的定义:

module.exports = function(app)

{

return new CustomRemote(app);

};

var CustomRemote = function(app)

{

this.app = app;

};

CustomRemote.prototype.method = fuction(arg0, arg1, ...)

{

//remote的方法和handler不同,没有固定的方法签名,可以随意定义方法的参数个数

//一般作为rpc的响应方法,通常会设置最后一个参数为cb回调,如果只是服务器内的简单调用,则不需要cb

};

--------------------------------------------

rpc调用:

self.app.rpc.服务器类型.文件名.方法名(session, arg0, arg1, …, cb)

rpc调用的方法实际上是由proxy.js生成的同名的代理方法,而且增加了一个session参数,这个参数可用于发送请求到后端服务器之前,参与路由计算获得最终要发送到的后端服务器id, 如果不打算响应返回数据, 需要显示的设置最后一个cb参数为null, 因为内部在发送请求到后端服务器前, 会去掉代理方法的第一个和最后一个参数.

---------------------------------------------

向客户端推送消息:

var channelService = this.app.get('channelService');

var param = { route: 'route' , ... }

channel.pushMessage(param); //param必须定义route, 客户端根据route来确定触发指定事件

//pushMessageByUids第二个参数需要指定uid (user id) 和 sid(server id)

channelService.pushMessageByUids(param, [{

uid: tuid,

sid: tsid

}]);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: