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

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

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

        之后对username和rid验证

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

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

        pomelo.request(route, {
        uid: uid
        }
      3. server:gate服务器
        handler.queryEntry = function(msg, session, next) {
        var uid = msg.uid;
        if(!uid) {
        next(null, {
        code: 500
        });
        return;
        }
        // get all connectors
        var connectors = this.app.getServersByType('connector');
        if(!connectors || connectors.length === 0) {
        next(null, {
        code: 500
        });
        return;
        }
        // select connector
        var res = dispatcher.dispatch(uid, connectors);
        next(null, {
        code: 200,
        host: res.host,
        port: res.clientPort
        });
        };

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

      4. client:连接connector服务器
        var route = "connector.entryHandler.enter";
        pomelo.request(route, {
        username: username,
        rid: rid
        }
      5. server:connector服务器
        handler.enter = function(msg, session, next) {
        var self = this;
        var rid = msg.rid;
        var uid = msg.username + '*' + rid
        var sessionService = self.app.get('sessionService'); console.log("rid="+rid +" uid="+uid);
        //duplicate log in
        if( !! sessionService.getByUid(uid)) {
        next(null, {
        code: 500,
        error: true
        });
        return;
        } session.bind(uid);
        session.set('rid', rid);
        session.push('rid', function(err) {
        if(err) {
        console.error('set rid for session service failed! error is : %j', err.stack);
        }
        });
        session.on('closed', onUserLeave.bind(null, self.app)); //put user into channel
        self.app.rpc.chat.chatRemote.add(session, uid, self.app.get('serverId'), rid, true, function(users){
        next(null, {
        users:users
        });
        });
        };

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

      6. server:chat服务器添加用户
        ChatRemote.prototype.add = function(uid, sid, name, flag, cb) {
        var channel = this.channelService.getChannel(name, flag);
        var username = uid.split('*')[0];
        var param = {
        route: 'onAdd',
        user: username
        };
        channel.pushMessage(param); if( !! channel) {
        channel.add(uid, sid);
        } cb(this.get(name, flag));
        };

        这里的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. lintcode 中等题:kth-largest-element 第k大元素

    题目 第k大元素 在数组中找到第k大的元素 样例 给出数组[9,3,2,4,8],第三大的元素是4 给出数组 [1,2,3,4,5],第一大的元素是5,第二大的元素是4,第三大的元素是3,以此类推 注 ...

  2. 如何在windows环境中搭建apache+subversion(ZT)

    我一直有一个想法就是在本机上象scm一样的搭建一个subversion服务器,然后每天写完代码的时候提交一下,这种感觉好好哦,之前我在windows环境中搭建过纯subversion的服务器兴奋过一阵 ...

  3. Linux系统与性能监控

    原文地址:http://kerrigan.sinaapp.com/post-7.html Linux System and Performance Monitoring http://www.hous ...

  4. Java API —— System类

    1.System类概述         System 类包含一些有用的类字段和方法.它不能被实例化.  2.成员方法         public static void gc():运行垃圾回收器   ...

  5. Support Library官方教程(3)android studio中导入支援包

    Support Library Setup How you setup the Android Support Libraries in your development project depend ...

  6. Windows 7下配置JDK环境变量和Java环境变量配置

    下面来介绍一下Java环境变量配置,是在Windows 7下配置JDK环境变量. 方法/步骤  1 安装JDK,安装过程中可以自定义安装目录等信息,例如我们选择安装目录为:C:\Program Fil ...

  7. [Codeforces670A]Holidays(数学,构造)

    题目链接:http://codeforces.com/contest/670/problem/A 题意:给n天,问这n天最少和最多有多少个休息日,不用区分平闰年. 这题写几个例子,YY一下就构造出来解 ...

  8. iOS开发:在Xcode中用Pods管理第三方库

    之前写了一篇 iOS开发:在Swift中调用oc库 ,今天记录一下如何用Pods的方式来管理第三方库,包括Swift/Object-C的库. 在这之前请先查阅Guides.CocoaPods如何使用的 ...

  9. UVa 12563 (01背包) Jin Ge Jin Qu hao

    如此水的01背包,居然让我WA了七次. 开始理解错题意了,弄反了主次关系.总曲目最多是大前提,其次才是歌曲总时间最长. 题意: 在KTV房间里还剩t秒的时间,可以从n首喜爱的歌里面选出若干首(每首歌只 ...

  10. Android基础_2 Activity线性布局和表格布局

    在activity的布局中,线性布局和表格布局是最简单的,这次分别从线性布局,表格布局以及线性布局和表格混合布局做了实验,实验中只需要编写 相应的xml的代码,java代码不需要更改,因为我们这里只是 ...