美文网首页基于node.js和Cocos Creator的开发
基于Node.js和Cocos Creator的开发【七,用户长

基于Node.js和Cocos Creator的开发【七,用户长

作者: Woodlouse | 来源:发表于2019-10-18 22:40 被阅读0次

    一,长连接和用户映射的数据结构

    用户连接到服务器后,后端需要做哪些工作以实现通信功能呢?

    需要:

    1. 根据用户ID找到用户的长连接;
    2. 根据长连接找到用户;

    能够根据用户ID找到长连接,这点比较容易理解,毕竟只有找到用户对应的长连接才能够给用户发送信息;那么根据长连接找到用户是来处理什么情况的呢?设想:如果用户的长连接断掉了,如何将其对应的用户的长连接置空呢?如果只有第1种映射关系,则需要遍历所有的用户ID和长连接的对应关系,为了提高效率我们后端还需要建立长连接和用户的映射关系,这时一个典型的以空间换时间的操作。

    根据我们的需要我们不难看出我们需要的数据结构是字典,在后端工程中添加文件,路径如下:
    utils/userConnMgr.js
    首先定义存储用户ID和长连接、长连接和用户ID的映射变量:

    var UIDtoConnMap = {}; // key: UserID val: socket connect
    var connToUIDMap = {}; // key: socket connect key : UserId
    

    二,设计操作

    对用户长连接的管理涉及到到:

    • 添加映射关系
    • 根据用户ID删除映射关系
    • 根据长连接删除映射关系
    • 根据用户ID查找长连接

    将以上操作放到userConnMgr,定义
    var userConnMgr={}
    下面依次实现各个功能。

    1,添加映射关系

    添加映射关系比较简单,在用户发来“enter”协议正确处理后,建立用户ID和长连接的对应关系

    userConnMgr.add = function(userId, conn) {
        UIDtoConnMap[userId] = conn;
        connToUIDMap[conn] = userId;
    }
    

    2,根据用户ID删除映射关系

    次功能需要一个用户ID,然后找到用户的长连接,将两个映射删除即可

    userConnMgr.removeByUserId = function(userId) {
        var conn = UIDtoConnMap[userId];
    
        delete connToUIDMap[conn];
        delete UIDtoConnMap[userId];
    }
    

    3,根据长连接删除映射关系

    在长连接关闭时,需要用到此函数来处理:

    userConnMgr.removeByConn = function(conn) {
        var userId = connToUIDMap[conn];
    
        delete UIDtoConnMap[userId];
        delete connToUIDMap[conn];
    }
    

    4,根据用户ID查找长连接

    在一个用户向另一个用户发送信息时需要使用到此功能:

    userConnMgr.get = function(userId) {
        return UIDtoConnMap[userId];
    }
    

    最后导出定义:

    module.exports = userConnMgr;
    

    三,应用

    1,添加映射关系

    添加映射关系的时机发生在处理用户的“enter”操作时

    socketHander.enter = function(data, conn) {
        var userId = data['userId'];
       userConnMgr.add(userId, conn);
    }
    

    2,删除映射关系

    删除映射关系添加用户的长连接断开时:

        conn.on("close", function (code, reason) {
            userConnMgr.removeByConn(conn);
            console.log("关闭连接");
        })
    

    至此,我们实现了对用户长连接的管理。


    代码在这儿


    上一篇 第一个长连接协议
    下一篇 建立服务端HTPP协议测试脚本

    相关文章

      网友评论

        本文标题:基于Node.js和Cocos Creator的开发【七,用户长

        本文链接:https://www.haomeiwen.com/subject/eqkbmctx.html