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
}]);