pomelo 学习零碎记录 4

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

}]); 

 

转载于:https://www.cnblogs.com/andyleeblog/archive/2012/12/08/2809201.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值