Commit a7591a18 by 蒋勇

d

parent a5285489
...@@ -63,11 +63,21 @@ class RedisClient { ...@@ -63,11 +63,21 @@ class RedisClient {
if (channel == "brc") {//如果是广播频道,则发送广播到客户端 if (channel == "brc") {//如果是广播频道,则发送广播到客户端
self.chatserver.server.emit("brc", message); self.chatserver.server.emit("brc", message);
} else if (self.chatserver.users[channel]) { } else if (self.chatserver.users[channel]) {
if (message.type) { if (!message.type || message.type == "single") {
self.chatserver.users[channel].client.emit(message.type, message.data);
} else {
//持久化
self.chatserver.users[channel].client.emit("chatmsg", message); self.chatserver.users[channel].client.emit("chatmsg", message);
//self.chatserver.users[channel].client.emit(message.type, message.data);
} else {
if (message.type == "many") {
//说明channel是房间名称,查续出房间中的人员uks,然后遍历后发送消息
let cs = await self.chatserver.rooms.clientsByRoom(channel)
for (c of cs) {
//订阅这个房间的节点,会检查这个房间内的客户链接,如果
//存在就发送
if (self.chatserver.users[c]) {
self.chatserver.users[c].client.emit("chatmsg", message);
}
}
}
} }
} }
} }
...@@ -110,8 +120,12 @@ class RedisClient { ...@@ -110,8 +120,12 @@ class RedisClient {
async lpop (key) { async lpop (key) {
return this.client.lpopAsync(key); return this.client.lpopAsync(key);
} }
//返回列表所有元素
async lrange (key) {
return this.client.lrangeAsync(key, 0, -1);
}
async lrem (key, val) { async lrem (key, val) {
return this.client.lremAsync(key, 1, val); return this.client.lremAsync(key, 0, val);
} }
async ltrim (key, s, e) { async ltrim (key, s, e) {
return this.client.ltrimAsync(key, s, e); return this.client.ltrimAsync(key, s, e);
...@@ -188,13 +202,18 @@ class RedisClient { ...@@ -188,13 +202,18 @@ class RedisClient {
} }
module.exports = RedisClient; module.exports = RedisClient;
// var client = new RedisClient(); // var client = new RedisClient();
// (async ()=>{ // (async () => {
// await client.rpush("tasklist","xxx"); // // await client.rpush("tasklist", "xxx");
// await client.rpush("tasklist","xxx"); // // await client.rpush("tasklist", "xxx");
// var len=await client.llen("tasklist"); // // var len = await client.llen("tasklist");
// //await client.clearlist("tasklist"); // // //await client.clearlist("tasklist");
// len=await client.llen("tasklist"); // // len = await client.llen("tasklist");
// console.log(len); // // console.log(len);
// await client.sadd("h", ["jy"])
// await client.sadd("h", ["ak"])
// let ms = await client.smembers("h")
// console.log(ms)
// })() // })()
// client.keys('*').then(s=>{ // client.keys('*').then(s=>{
...@@ -206,13 +225,13 @@ module.exports = RedisClient; ...@@ -206,13 +225,13 @@ module.exports = RedisClient;
// client.sadd("h",["ok","jy","ok"]).then(function(r){ // client.sadd("h",["ok","jy","ok"]).then(function(r){
// console.log(r); // console.log(r);
// }); // });
// client.sadd("h","jy").then(function(r){ // client.sadd("h", "jy").then(function (r) {
// console.log(r); // console.log(r);
// }); // });
// client.srem("h","jy").then(function(r){ // client.sadd("h", "ak).then(function (r) {
// console.log(r); // console.log(r);
// }); // });
// client.smembers("h").then(function(r){ // client.smembers("h").then(function (r) {
// console.log(r); // console.log(r);
// }); // });
// client.sismember("h","ok").then(function(r){ // client.sismember("h","ok").then(function(r){
...@@ -236,4 +255,4 @@ module.exports = RedisClient; ...@@ -236,4 +255,4 @@ module.exports = RedisClient;
// console.log(u); // console.log(u);
// }); // });
// },3000); // },3000);
// }); //});
...@@ -10,6 +10,8 @@ class RoomSet { ...@@ -10,6 +10,8 @@ class RoomSet {
this.server = server this.server = server
this.roomsetkey = "roomset";//房间集 this.roomsetkey = "roomset";//房间集
this.membersetkey = "memberset";//人员集 this.membersetkey = "memberset";//人员集
this.ownroomsurfix = "_own"
this.onlinekey = "_onlines"
this.init(); this.init();
} }
init () { init () {
...@@ -19,7 +21,7 @@ class RoomSet { ...@@ -19,7 +21,7 @@ class RoomSet {
* 按照房间名查看人员 * 按照房间名查看人员
*/ */
async clientsByRoom (roomname) { async clientsByRoom (roomname) {
let rlst = await redisClient.smembers(roomname) let rlst = await redisClient.lrange(roomname)
return rlst return rlst
} }
/** /**
...@@ -38,32 +40,73 @@ class RoomSet { ...@@ -38,32 +40,73 @@ class RoomSet {
} }
/** /**
* 查看某人拥有的房间
* 已经排除私人房间
* @param {*} ukstr
*/
async ownRooms (ukstr) {
let rms = await redisClient.smembers(ukstr + this.ownroomsurfix);
return rms
}
/**
* 房间登记 * 房间登记
* @param {*} roomname * @param {*} roomname
*/ */
async joinRoom (roomname, ukencstr) { async joinRoom (roomname, ukencstr) {
//缓存所有房间名称 //缓存所有房间名称
await redisClient.sadd(this.roomsetkey, roomname) await redisClient.sadd(this.roomsetkey, [roomname])
//房间中缓存链接的客户uk //房间中缓存链接的客户uk,第一个人就是房主
await redisClient.sadd(roomname, ukencstr) //检查是否已经存在todo
await redisClient.rpush(roomname, ukencstr)
//缓存某人拥有的房间,排除私人房间,为了显示群聊
if (roomname != ukencstr) {
await redisClient.sadd(ukencstr + this.ownroomsurfix, [roomname])
}
// 订阅房间消息,进入一个房间就要订阅这个房间的消息 // 订阅房间消息,进入一个房间就要订阅这个房间的消息
await redisClient.subscribe(roomname, this.server); await redisClient.subscribe(roomname, this.server);
//发送新登录用户的广播 //发送新登录用户的广播
redisClient.publish("brc", "hello,world,i coming....") if (roomname == ukencstr) {
let countonlines = await redisClient.sadd(this.onlinekey, [ukencstr])
console.log("current lines....", countonlines)
redisClient.publish("brc", "new user login....online count:" + countonlines)
}
return {} return {}
} }
async reJoinRooms (ukstr) {
let ownedRooms = await this.ownRooms(ukstr)
console.log(ownedRooms)
for (let r of ownedRooms) {
redisClient.subscribe(r)
}
}
/**
* 解决当断开链接时,清除在断开节点上的原有房间订阅
* @param {*} ukstr
*/
async unsubscribeOwnedRooms (ukstr) {
let ownedRooms = await this.ownRooms(ukstr)
for (let r of ownedRooms) {
await redisClient.unsubscribe(r)
}
}
/** /**
* ukencstr 从房间 roomname退出 * ukencstr 从房间 roomname退出
* @param {*} roomname * @param {*} roomname
* @param {*} ukencstr * @param {*} ukencstr
*/ */
async exitRoom (roomname, ukencstr) { async exitRoom (roomname, ukencstr) {
//清除某人拥有的房间缓存
await redisClient.srem(ukencstr + this.ownroomsurfix, roomname)
//从房间退出 //从房间退出
await redisClient.srem(roomname, ukencstr) await redisClient.lrem(roomname, ukencstr)
//是否房间里已经没人,如果没有了 //是否房间里已经没人,如果没有了
let ms = await redisClient.smembers(roomname) let personCountInRoom = await redisClient.llen(roomname)
if (ms.length == 0) {//如果房间没有人,就取消 if (personCountInRoom == 0) {//如果房间没有人,就取消
await redisClient.delete(roomname) await redisClient.delete(roomname)
//从房间缓存中删除 //从房间缓存中删除
await redisClient.srem(this.roomsetkey, roomname) await redisClient.srem(this.roomsetkey, roomname)
...@@ -98,7 +141,7 @@ class MsgHandler { ...@@ -98,7 +141,7 @@ class MsgHandler {
var tochannel = arrs[0] + "¥" + arrs[1]; var tochannel = arrs[0] + "¥" + arrs[1];
//发布消息 //发布消息
//持久化消息 //持久化消息
var msgH = { msgType: "single", sender: msg.from, target: msg.to, content: msg.content }; var msgH = { msgType: msg.type ? msg.type : "single", sender: msg.from, target: msg.to, content: msg.content };
msgHistoryService.create(msgH).then((m) => { msgHistoryService.create(msgH).then((m) => {
redisClient.publish(tochannel, JSON.stringify(msg)); redisClient.publish(tochannel, JSON.stringify(msg));
}).catch(e => { }).catch(e => {
...@@ -190,6 +233,9 @@ class SocketServer { ...@@ -190,6 +233,9 @@ class SocketServer {
//(订阅uk)开私人频道房间,并缓存房间名 //(订阅uk)开私人频道房间,并缓存房间名
self.rooms.joinRoom(ukencstr, ukencstr) self.rooms.joinRoom(ukencstr, ukencstr)
//初始化当前uk,历史未退出的房间,重新在新的节点订阅
self.rooms.reJoinRooms(ukencstr)
console.log(self.socketidMap)
}) })
// // // //
...@@ -200,14 +246,26 @@ class SocketServer { ...@@ -200,14 +246,26 @@ class SocketServer {
client.on('disconnect', async function (r) { client.on('disconnect', async function (r) {
console.log("connection.........................................dismiss.............", client.id, r); console.log("connection.........................................dismiss.............", client.id, r);
let ukencstr = self.socketidMap[client.id] let ukencstr = self.socketidMap[client.id]
console.log(ukencstr, "ddddddddddddd")
if (ukencstr && ukencstr != "undefined") { if (ukencstr && ukencstr != "undefined") {
console.log(ukencstr, "will delete.....") console.log(ukencstr, "will delete.....")
delete self.users[ukencstr] delete self.users[ukencstr]
delete self.uinfos[ukencstr] delete self.uinfos[ukencstr]
//断开链接时,从自己私人房间退出 //断开链接时,从自己私人房间退出
self.rooms.exitRoom(ukencstr, ukencstr) self.rooms.exitRoom(ukencstr, ukencstr)
//取消当前人在当前节点,对其它房间的订阅,但不清除曾经加入过的房间,除非显式退出房间
self.rooms.unsubscribeOwnedRooms(ukencstr)
//删除在线人数
await redisClient.srem(self.rooms.onlinekey, ukencstr)
//当前在线人数
let c = await redisClient.scard(self.rooms.onlinekey)
self.server.emit("brc", "current user:" + c)
//删除私人房间uk //删除私人房间uk
delete self.socketidMap[client.id] delete self.socketidMap[client.id]
} }
}); });
......
sequenceDiagram
ROBOT->>TMG: 查看回执信息
TMG-->>+ROBOT: 回执信息列表
loop 遍历回执列表
ROBOT->>+FQTM:回执是否已经更新
opt 未更新
FQTM-->>ROBOT:回执未更新
ROBOT->>TMG: 下载回执
TMG-->>ROBOT: 回执
ROBOT->>OSS:上传到OSS
OSS-->>ROBOT:文件地址
ROBOT-xFQTM: 更新官文地址
end
end
graph TB
A[start]-->B(in progress)
B-->C{ok/yes}
C-->D
C-->E
D-->F
E-->F
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment