Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
ws-rst
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
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
qlintonger xeno
ws-rst
Commits
e6b0f4c6
Commit
e6b0f4c6
authored
Feb 11, 2025
by
qlintonger xeno
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
CmdUpdateOnlineUsers完毕!
parent
9302eff9
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
36 additions
and
6 deletions
+36
-6
.gitignore
+4
-2
src/client.rs
+16
-0
src/handles/close_connection.rs
+9
-0
src/handles/online_users_update.rs
+3
-2
src/handles/redis.rs
+4
-2
No files found.
.gitignore
View file @
e6b0f4c6
/target
.idea
Cargo.lock
\ No newline at end of file
Cargo.lock
.venv
test
\ No newline at end of file
src/client.rs
View file @
e6b0f4c6
...
...
@@ -16,6 +16,7 @@ use tokio::time;
use
tokio_tungstenite
::
accept_hdr_async
;
use
tungstenite
::
handshake
::
server
::{
Request
,
Response
};
use
tungstenite
::{
Error
,
Message
};
use
crate
::
handles
::
online_users_update
::
send_online_users_resp
;
lazy_static!
{
pub
static
ref
CONNECTIONS
:
ConnectionMap
=
Arc
::
new
(
AsyncRwLock
::
new
(
HashMap
::
new
()));
...
...
@@ -111,6 +112,13 @@ pub(crate) async fn handle_client(stream: tokio::net::TcpStream) -> Result<(), E
println!
(
"将用户信息插入到 Redis 中时出错: {}"
,
e
);
}
// 准备更新用户链接
if
let
Err
(
e
)
=
send_online_users_resp
()
.await
{
println!
(
"在处理新用户id {} 之时广播,处理在线用户列表出错了:{:?}"
,
&
from_id
,
e
);
}
else
{
println!
(
"广播消息 来源id {} 成功"
,
&
from_id
);
}
let
task
=
tokio
::
spawn
(
async
move
{
let
mut
last_heartbeat_time
=
Instant
::
now
();
loop
{
...
...
@@ -142,6 +150,14 @@ pub(crate) async fn handle_client(stream: tokio::net::TcpStream) -> Result<(), E
}
}
},
"GetOnlineUserList"
=>
{
println!
(
"收到客户端获取在线用户列表 {:?}"
,
&
data
);
if
let
Err
(
e
)
=
send_online_users_resp
()
.await
{
println!
(
"处理在线用户列表出错了:{:?}"
,
e
);
handle_connection_error
(
&
from_id_clone
,
&
CONNECTIONS
,
&
TASKS
)
.await
;
break
;
}
},
_
=>
{
if
let
Err
(
e
)
=
handle_other_message
(
&
mut
sender_ref
,
&
data
,
&
from_id_clone
)
.await
{
println!
(
"Failed to handle other message: {}"
,
e
);
...
...
src/handles/close_connection.rs
View file @
e6b0f4c6
use
crate
::
handles
::
redis
::
remove_this_connection
;
use
crate
::
typing
::
used_typed
::{
ConnectionMap
,
TaskMap
};
use
tokio
::
sync
::
RwLockWriteGuard
;
use
crate
::
handles
::
online_users_update
::
send_online_users_resp
;
pub
async
fn
handle_connection_error
(
from_id
:
&
str
,
...
...
@@ -43,4 +44,11 @@ pub async fn handle_connection_error(
}
println!
(
"断开与用户id: {} 的连接并完成清理操作"
,
from_id
);
// 准备更新用户链接
if
let
Err
(
e
)
=
send_online_users_resp
()
.await
{
println!
(
"在处理新用户id {} 之时广播,处理在线用户列表出错了:{:?}"
,
&
from_id
,
e
);
}
else
{
println!
(
"成功将用户id {} 退出广播至其余用户"
,
&
from_id
);
}
}
\ No newline at end of file
src/handles/online_users_update.rs
View file @
e6b0f4c6
...
...
@@ -60,10 +60,11 @@ where
Ok
(
Arc
::
new
(
data
))
}
pub
async
fn
send_
multiple_messages
()
->
Result
<
(),
Error
>
{
pub
async
fn
send_
online_users_resp
()
->
Result
<
(),
Error
>
{
let
mut
msg_data
=
Vec
::
new
();
{
let
online_users
=
ONLINE_USERS
.read
()
.await
;
println!
(
"当前所有用户数据信息 ONLINE_USERS: {:?}"
,
online_users
);
for
(
_
,
user_info_str
)
in
online_users
.iter
()
{
let
parts
:
Vec
<&
str
>
=
user_info_str
.split
(
','
)
.collect
();
if
parts
.len
()
==
9
{
...
...
@@ -88,7 +89,7 @@ pub async fn send_multiple_messages() -> Result<(), Error> {
for
(
_
,
connection
)
in
connections
.iter_mut
()
{
let
to_id
=
connection
.from_id
.to_string
();
let
message
=
OnlineUsersMessage
{
msg_type
:
"
GetOnlineUserList
"
.to_string
(),
msg_type
:
"
CmdUpdateOnlineUsers
"
.to_string
(),
from_id
:
"0"
.to_string
(),
from_name
:
"Server"
.to_string
(),
to_id
,
...
...
src/handles/redis.rs
View file @
e6b0f4c6
...
...
@@ -48,9 +48,10 @@ pub async fn insert_this_connection(
// 按照结构体OnlineUserMessage的格式构造用户信息字符串,用逗号拼接即可
// callState,channelID,deviceID,fromID,hasCamera,hasMike,isHost,userCallGroup,fromName
let
user_info_str
=
format!
(
"{},{},{},1,1,0,0,{}"
,
"{},{},{},
{},
1,1,0,0,{}"
,
"idle"
,
""
,
from_id
,
device_id
,
from_name
);
...
...
@@ -67,7 +68,7 @@ pub async fn insert_this_connection(
// 获取写锁以进行写操作
let
mut
online_users
=
ONLINE_USERS
.write
()
.await
;
online_users
.insert
(
from_id
.to_string
(),
user_info_str
);
println!
(
"成功将用户id: {} 的信息插入到
Redis
中"
,
from_id
);
println!
(
"成功将用户id: {} 的信息插入到
ONLINE_USERS
中"
,
from_id
);
}
Ok
(())
}
\ No newline at end of file
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