Commit a7591a18 by 蒋勇

d

parent a5285489
......@@ -63,11 +63,21 @@ class RedisClient {
if (channel == "brc") {//如果是广播频道,则发送广播到客户端
self.chatserver.server.emit("brc", message);
} else if (self.chatserver.users[channel]) {
if (message.type) {
self.chatserver.users[channel].client.emit(message.type, message.data);
} else {
//持久化
if (!message.type || message.type == "single") {
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 {
async lpop (key) {
return this.client.lpopAsync(key);
}
//返回列表所有元素
async lrange (key) {
return this.client.lrangeAsync(key, 0, -1);
}
async lrem (key, val) {
return this.client.lremAsync(key, 1, val);
return this.client.lremAsync(key, 0, val);
}
async ltrim (key, s, e) {
return this.client.ltrimAsync(key, s, e);
......@@ -188,13 +202,18 @@ class RedisClient {
}
module.exports = RedisClient;
// var client = new RedisClient();
// (async ()=>{
// await client.rpush("tasklist","xxx");
// await client.rpush("tasklist","xxx");
// var len=await client.llen("tasklist");
// //await client.clearlist("tasklist");
// len=await client.llen("tasklist");
// console.log(len);
// (async () => {
// // await client.rpush("tasklist", "xxx");
// // await client.rpush("tasklist", "xxx");
// // var len = await client.llen("tasklist");
// // //await client.clearlist("tasklist");
// // len = await client.llen("tasklist");
// // 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=>{
......@@ -206,13 +225,13 @@ module.exports = RedisClient;
// client.sadd("h",["ok","jy","ok"]).then(function(r){
// console.log(r);
// });
// client.sadd("h","jy").then(function(r){
// client.sadd("h", "jy").then(function (r) {
// console.log(r);
// });
// client.srem("h","jy").then(function(r){
// client.sadd("h", "ak).then(function (r) {
// console.log(r);
// });
// client.smembers("h").then(function(r){
// client.smembers("h").then(function (r) {
// console.log(r);
// });
// client.sismember("h","ok").then(function(r){
......@@ -236,4 +255,4 @@ module.exports = RedisClient;
// console.log(u);
// });
// },3000);
// });
//});
......@@ -10,6 +10,8 @@ class RoomSet {
this.server = server
this.roomsetkey = "roomset";//房间集
this.membersetkey = "memberset";//人员集
this.ownroomsurfix = "_own"
this.onlinekey = "_onlines"
this.init();
}
init () {
......@@ -19,7 +21,7 @@ class RoomSet {
* 按照房间名查看人员
*/
async clientsByRoom (roomname) {
let rlst = await redisClient.smembers(roomname)
let rlst = await redisClient.lrange(roomname)
return rlst
}
/**
......@@ -38,32 +40,73 @@ class RoomSet {
}
/**
* 查看某人拥有的房间
* 已经排除私人房间
* @param {*} ukstr
*/
async ownRooms (ukstr) {
let rms = await redisClient.smembers(ukstr + this.ownroomsurfix);
return rms
}
/**
* 房间登记
* @param {*} roomname
*/
async joinRoom (roomname, ukencstr) {
//缓存所有房间名称
await redisClient.sadd(this.roomsetkey, roomname)
//房间中缓存链接的客户uk
await redisClient.sadd(roomname, ukencstr)
await redisClient.sadd(this.roomsetkey, [roomname])
//房间中缓存链接的客户uk,第一个人就是房主
//检查是否已经存在todo
await redisClient.rpush(roomname, ukencstr)
//缓存某人拥有的房间,排除私人房间,为了显示群聊
if (roomname != ukencstr) {
await redisClient.sadd(ukencstr + this.ownroomsurfix, [roomname])
}
// 订阅房间消息,进入一个房间就要订阅这个房间的消息
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 {}
}
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退出
* @param {*} roomname
* @param {*} 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)
if (ms.length == 0) {//如果房间没有人,就取消
let personCountInRoom = await redisClient.llen(roomname)
if (personCountInRoom == 0) {//如果房间没有人,就取消
await redisClient.delete(roomname)
//从房间缓存中删除
await redisClient.srem(this.roomsetkey, roomname)
......@@ -98,7 +141,7 @@ class MsgHandler {
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) => {
redisClient.publish(tochannel, JSON.stringify(msg));
}).catch(e => {
......@@ -190,6 +233,9 @@ class SocketServer {
//(订阅uk)开私人频道房间,并缓存房间名
self.rooms.joinRoom(ukencstr, ukencstr)
//初始化当前uk,历史未退出的房间,重新在新的节点订阅
self.rooms.reJoinRooms(ukencstr)
console.log(self.socketidMap)
})
// //
......@@ -200,14 +246,26 @@ class SocketServer {
client.on('disconnect', async function (r) {
console.log("connection.........................................dismiss.............", client.id, r);
let ukencstr = self.socketidMap[client.id]
console.log(ukencstr, "ddddddddddddd")
if (ukencstr && ukencstr != "undefined") {
console.log(ukencstr, "will delete.....")
delete self.users[ukencstr]
delete self.uinfos[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
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