pomelo源码分析(7)--connector与其它组件交互
来源:互联网 发布:常用sql语句面试题 编辑:程序博客网 时间:2024/06/10 09:33
作者:shihuaping0918@163.com,转载请注明作者
connector是一个重量级组件,它依赖connection/server/pushScheduler/session组件。
对session组件的依赖是对连接创建一个session。
对connection的依赖是连接数的增加减少,以及登录用户uid的管理。
对pushScheduler的依赖是,当异步发送时,把发送任务放到scheduler里。
对server的依赖就是取一些配置,以及server本身的信息。
下面依次对它们进行介绍。首先从session开始,session和connection的依赖代码有一部分是在一起的。
/** * get session for current connection */var getSession = function(self, socket) { var app = self.app, sid = socket.id; var session = self.session.get(sid); //sid if (session) { return session; } //这里创建一个session, session = self.session.create(sid, app.getServerId(), socket); logger.debug('[%s] getSession session is created with session id: %s', app.getServerId(), sid); // bind events for session socket.on('disconnect', session.closed.bind(session)); socket.on('error', session.closed.bind(session)); session.on('closed', onSessionClose.bind(null, app)); session.on('bind', function(uid) { logger.debug('session on [%s] bind with uid: %s', self.app.serverId, uid); // update connection statistics if necessary if (self.connection) { //添加用户到connection中 self.connection.addLoginedUser(uid, { loginTime: Date.now(), uid: uid, address: socket.remoteAddress.ip + ':' + socket.remoteAddress.port }); } self.app.event.emit(events.BIND_SESSION, session); }); session.on('unbind', function(uid) { if (self.connection) { //从connection中移除用户 self.connection.removeLoginedUser(uid); } self.app.event.emit(events.UNBIND_SESSION, session); }); return session;};
getSession这个函数是在 var bindEvents = function(self, socket)
这个函数里调用的。它的主要工作就是给事件绑定回调函数。和session有关的就是创建session了。和connection有关的就是添加用户和移除用户。session真正的实现都在service/sessionService.js里面。component/session.js只是一个抽象。对connection也是同理。
再来看一下pushScheduler是怎么被调用的,这里不涉及pushScheduler的内部机制,只看connector调用了它哪些接口。
pro.send = function(reqId, route, msg, recvs, opts, cb) { logger.debug('[%s] send message reqId: %s, route: %s, msg: %j, receivers: %j, opts: %j', this.app.serverId, reqId, route, msg, recvs, opts); if (this.useAsyncCoder) { return this.sendAsync(reqId, route, msg, recvs, opts, cb); } var emsg = msg; if (this.encode) { // use costumized encode emsg = this.encode.call(this, reqId, route, msg); } else if (this.connector.encode) { // use connector default encode emsg = this.connector.encode(reqId, route, msg); } this.doSend(reqId, route, emsg, recvs, opts, cb);};pro.sendAsync = function(reqId, route, msg, recvs, opts, cb) { var emsg = msg; var self = this; if (this.encode) { // use costumized encode this.encode(reqId, route, msg, function(err, encodeMsg) { if (err) { return cb(err); } emsg = encodeMsg; self.doSend(reqId, route, emsg, recvs, opts, cb); }); } else if (this.connector.encode) { // use connector default encode this.connector.encode(reqId, route, msg, function(err, encodeMsg) { if (err) { return cb(err); } emsg = encodeMsg; self.doSend(reqId, route, emsg, recvs, opts, cb); }); }}pro.doSend = function(reqId, route, emsg, recvs, opts, cb) { if (!emsg) { process.nextTick(function() { return cb && cb(new Error('fail to send message for encode result is empty.')); }); } //只需要关注这里就可以了 this.app.components.__pushScheduler__.schedule(reqId, route, emsg, recvs, opts, cb);}
send和sendAsync的区别不是表现在网络发送上,而是在编码上,代码中最终网络发送调的都是doSend。把要发的内容放到sheduler里面去,在里面进行真正的发送操作。
最后看一下对server的依赖,connector对server的依赖表现在取一些配置信息上。比如要绑定的host/port。
var getConnector = function(app, opts) { var connector = opts.connector; if (!connector) { return getDefaultConnector(app, opts); } if (typeof connector !== 'function') { return connector; } //就是这里了 var curServer = app.getCurServer(); //取clientPort,host return connector(curServer.clientPort, curServer.host, opts);};
另外还有一个依赖就是要调用server中的handler对消息进行处理。
self.server.globalHandle(msg, session.toFrontendSession(), function(err, resp, opts) {
对connector本身的分析到这里就算是基本完成了,但是又留下了更多的疑问。其中session/connection还比较好理解。而scheduler和server理解起来就是有一定困难的。后续会慢慢讲到。
- pomelo源码分析(7)--connector与其它组件交互
- pomelo源码分析(4)--connector之网络监听
- pomelo源码分析(6)--connector协议处理message
- pomelo源码分析(一)
- pAdTy_-4 与其它应用程序的交互
- app与其它应用的交互
- pomelo源码分析(二)
- pomelo源码分析(三)
- pomelo源码分析(四)
- pomelo源码分析(五)
- pomelo源码分析(六)
- pomelo源码分析(8)--session
- pomelo源码解析之compnent组件启动
- pomelo源码解析之组件Remote
- jQuery源码分析:如何解决jQuery、$关键字与其它脚本框架的冲突问题?
- 【Pomelo源码分析】2016-09-20 入门(pomelo命令)
- pomelo组就之server组件分析
- pomelo组就之server组件分析
- jsp的基本语法(3个指令,6个动作,9大内置对象)
- ES6 —(Module 的加载实现)
- H5---面试题十二
- 牛客网编程-矩形覆盖(java)
- 58 同城 iOS 客户端 IM 系统演变历程
- pomelo源码分析(7)--connector与其它组件交互
- Android进程生命周期(Process LifeCycle)
- uva572(DFS 油田)
- 重装系统时遇到的"setup was unable to create a new system partition"错误
- python+selenium自动化软件测试(第4章):场景判断与封装
- PAT[1006]换个格式输出整数
- pomelo源码分析(8)--session
- 友盟第三方分享QQ分享不走回调方法或者显示取消分享的问题
- Kafka 基本原理