下面从头到尾记录chat demo的Login的过程

      1. client:点击login按钮,取得username和rid两个值

        1. $("#login").click(function() {
        2. username = $("#loginUser").attr("value");
        3. rid = $('#channelList').val();

        之后对username和rid验证

      2. client:连接gate服务器
        1. pomelo.init({
        2. host: host,
        3. port: port,
        4. log: true
        5. }

        请求路由 'gate.gateHandler.queryEntry'。

        1. pomelo.request(route, {
        2. uid: uid
        3. }
      3. server:gate服务器
        1. handler.queryEntry = function(msg, session, next) {
        2. var uid = msg.uid;
        3. if(!uid) {
        4. next(null, {
        5. code: 500
        6. });
        7. return;
        8. }
        9. // get all connectors
        10. var connectors = this.app.getServersByType('connector');
        11. if(!connectors || connectors.length === 0) {
        12. next(null, {
        13. code: 500
        14. });
        15. return;
        16. }
        17. // select connector
        18. var res = dispatcher.dispatch(uid, connectors);
        19. next(null, {
        20. code: 200,
        21. host: res.host,
        22. port: res.clientPort
        23. });
        24. };

        主要就是分配一个connector服务器,返回它的host和port

      4. client:连接connector服务器
        1. var route = "connector.entryHandler.enter";
        2. pomelo.request(route, {
        3. username: username,
        4. rid: rid
        5. }
      5. server:connector服务器
        1. handler.enter = function(msg, session, next) {
        2. var self = this;
        3. var rid = msg.rid;
        4. var uid = msg.username + '*' + rid
        5. var sessionService = self.app.get('sessionService');
        6.  
        7. console.log("rid="+rid +" uid="+uid);
        8. //duplicate log in
        9. if( !! sessionService.getByUid(uid)) {
        10. next(null, {
        11. code: 500,
        12. error: true
        13. });
        14. return;
        15. }
        16.  
        17. session.bind(uid);
        18. session.set('rid', rid);
        19. session.push('rid', function(err) {
        20. if(err) {
        21. console.error('set rid for session service failed! error is : %j', err.stack);
        22. }
        23. });
        24. session.on('closed', onUserLeave.bind(null, self.app));
        25.  
        26. //put user into channel
        27. self.app.rpc.chat.chatRemote.add(session, uid, self.app.get('serverId'), rid, true, function(users){
        28. next(null, {
        29. users:users
        30. });
        31. });
        32. };

        检测一下是否重复登陆了,把session与uid绑定,在setting里设置rid,注意需要push,session设置回调“closed”,rpc调用chat服务器

      6. server:chat服务器添加用户
        1. ChatRemote.prototype.add = function(uid, sid, name, flag, cb) {
        2. var channel = this.channelService.getChannel(name, flag);
        3. var username = uid.split('*')[0];
        4. var param = {
        5. route: 'onAdd',
        6. user: username
        7. };
        8. channel.pushMessage(param);
        9.  
        10. if( !! channel) {
        11. channel.add(uid, sid);
        12. }
        13.  
        14. cb(this.get(name, flag));
        15. };

        这里的uid是“uid*rid”, sid是server id,name是rid,flag是true。向channel中所有用户发送onaAdd信息,再把uid加入channel

读pomelo的教程-2的更多相关文章

  1. 读pomelo的教程-1

    pomelo教程的例子是一个聊天室,包括一个webserver客户端,和一个gameserver的pomelo服务器.这个例子挺好,一个聊天系统逻辑简单,还包括了用户管理,客户端request,服务器 ...

  2. 读w3c中文教程对键盘事件解释的感想 -遁地龙卷风

    写这篇博文源于w3c中文教程对键盘事件的解释, onkeydown 某个键盘按键被按下 onkeypress 某个键盘按键被按下并松开 onkeyup 某个键盘按键被松开 可在实践中发现 只注册key ...

  3. 笔记-读官方Git教程(2)~安装与配置

    小书匠 版本管理  教程内容基本来自git官方教程,认真都了系列的文章,然后对一些重点的记录下来,做了简单的归纳并写上自己的思考. 1.安装 在基于 Debian 的发行版上,使用 apt-get安装 ...

  4. 笔记-读官方Git教程(1)~认识Git

    小书匠版本管理 教程内容基本来自git官方教程,认真都了系列的文章,然后对一些重点的记录下来,做了简单的归纳并写上自己的思考. 目录: 1.Git介绍 2.Git版本控制原理 3.Git特点 4.Gi ...

  5. python中global的用法——再读python简明教程

    今天看了知乎@萧井陌的编程入门指南,想重温一下 <python简明教程>,对global的用法一直不太熟练,在此熟练一下,并实践一下python中list.tuple.set作为参数的区别 ...

  6. 读C#图解教程的笔记

    第一章记录: 格式化字符串 Console.WriteLine("{0:D}", 123456789);//表示十进制字符串 Console.WriteLine("{0: ...

  7. [未读]angularjs权威教程

    正在啃,赶脚不错...

  8. Mysql读写锁保姆级图文教程

    摘要:读锁会阻塞写,但是不会阻塞读,而写锁会把杜希俄都阻塞. 本文分享自华为云社区<Mysql保姆级读写锁图文教程丨[绽放吧!数据库]>,作者:Code皮皮虾 . 准备 创建mylock表 ...

  9. NeHe OpenGL教程 第一课:OpenGL窗口

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

随机推荐

  1. Project Euler 100 : Arranged probability 安排概率

    Arranged probability If a box contains twenty-one coloured discs, composed of fifteen blue discs and ...

  2. IT讲师韩顺平:我为什么辞去百万年薪,自己创业?

    先自我介绍一下,我叫韩顺平,是一名IT讲师.国内很多自学PHP和Java的朋友都看过我的视频课程,算是有些知名度. 15年8月从传智辞职后,很多朋友非常关心我的去向,网上也流传各种说法,有的说我和某某 ...

  3. python list去重的方法

    转载于:http://yxmhero1989.blog.163.com/blog/static/112157956201381443244790/ Python很简洁 我们喜欢简单有效的代码   一. ...

  4. Photoshop:热气球的制作方法

    大致流程: 1.做等宽色块,加内发光 2.变形->膨化,弯曲20% 3.加高光和投影层,增加立体感 4.制作多列,合并后,滤镜->扭曲->球面化100%2次(注意放在在正方形画布中间 ...

  5. windows系统下Python环境的搭建

    1.下载最新的Python版本3.5.0.

  6. EF 实体关系

    基于共享主键的一对一: this.HasRequired(t => t.TRDConInfo) .WithOptional(t => t.TRDFoundationProjCheck); ...

  7. Java连接MySQL数据库及简单操作代码

    1.Java连接MySQL数据库 Java连接MySql需要下载JDBC驱动MySQL-connector-java-5.0.5.zip(举例,现有新版本).然后将其解压缩到任一目录.我是解压到D盘, ...

  8. sh.exe": grunt: command not found

    今天在git命令行工具中使用 grunt的时候,总是提示我找不到grunt命令,如: sh.exe": grunt: command not found 但是我运行 npm install ...

  9. Instruments-查看收集到的数据

    由于Xcode调试工具Instruments指南篇幅太长,所以本篇blog继续上篇,介绍对Instruments收集到的数据去分析. 关于数据分析 Instruments不解决你代码中的任何问题,它帮 ...

  10. 解决魅族USB调试无法被电脑识别的问题(含Mac OS X、Win7)

      每次打开豌豆荚或者360手机助手之类手机助手后Eclipse才会检测到mx4(实际上是豌豆荚关闭eclipse的adb使用自己的驱动连接的).解决方法就是在"adb_usb.ini&qu ...