Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Z
zhichan
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
蒋勇
zhichan
Commits
a7591a18
Commit
a7591a18
authored
Oct 12, 2020
by
蒋勇
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
d
parent
a5285489
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
125 additions
and
25 deletions
+125
-25
im-center/app/base/utils/redisClient.js
+35
-16
im-center/app/config/socket.server2.js
+67
-9
im-center/design.mmd
+23
-0
No files found.
im-center/app/base/utils/redisClient.js
View file @
a7591a18
...
@@ -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.s
rem("h","jy").then(function(r)
{
// client.s
add("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);
//
});
//
});
im-center/app/config/socket.server2.js
View file @
a7591a18
...
@@ -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
.
s
rem
(
roomname
,
ukencstr
)
await
redisClient
.
l
rem
(
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
]
}
}
});
});
...
...
im-center/design.mmd
0 → 100644
View file @
a7591a18
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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment