一,长连接和用户映射的数据结构
用户连接到服务器后,后端需要做哪些工作以实现通信功能呢?
需要:
- 根据用户ID找到用户的长连接;
- 根据长连接找到用户;
能够根据用户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协议测试脚本
网友评论