feat: update

This commit is contained in:
2021-06-13 18:43:22 +08:00
parent 5f757269bc
commit 0f33eab15b
3 changed files with 24 additions and 34 deletions

1
Cargo.lock generated
View File

@@ -915,4 +915,5 @@ dependencies = [
"rustyline", "rustyline",
"tokio", "tokio",
"tokio-tungstenite", "tokio-tungstenite",
"url",
] ]

View File

@@ -7,6 +7,7 @@ edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
url = "2.0.0"
clap = "2.33.3" clap = "2.33.3"
rust_util = "0.6.39" rust_util = "0.6.39"
rustyline = "8.2.0" rustyline = "8.2.0"

View File

@@ -7,11 +7,7 @@ use rust_util::XResult;
use futures_util::{StreamExt, SinkExt}; use futures_util::{StreamExt, SinkExt};
use tokio_tungstenite::tungstenite::Message; use tokio_tungstenite::tungstenite::Message;
use tokio::sync::mpsc::channel; use tokio::sync::mpsc::channel;
use url::Url;
enum SimpleMessage {
End,
Msg(Message),
}
#[tokio::main] #[tokio::main]
async fn main() { async fn main() {
@@ -23,40 +19,30 @@ async fn main() {
failure_and_exit!("Arg --connect is required."); failure_and_exit!("Arg --connect is required.");
}); });
let r = connect_to_and_loop(connect).await; let url = Url::parse(connect).unwrap_or_else(|e| {
failure_and_exit!("Parse connect url: {}, failed: {}", connect, e);
});
let r = connect_to_and_loop(&url).await;
match r { match r {
Ok(_) => success!("Success"), Ok(_) => success!("Success"),
Err(e) => failure!("Error: {}", e), Err(e) => failure!("Error: {}", e),
} }
} }
async fn connect_to_and_loop(url: &str) -> XResult<()> { async fn connect_to_and_loop(url: &Url) -> XResult<()> {
let (ws_stream, _) = connect_async(url).await?; let (ws_stream, _) = connect_async(url).await?;
let (mut ws_write, mut ws_read) = ws_stream.split(); let (mut ws_write, mut ws_read) = ws_stream.split();
let (sender, mut receiver) = channel(2); let (sender, mut receiver) = channel(2);
let cloned_sender = sender.clone();
let end_simple_msg_loop = || async {
cloned_sender.send(SimpleMessage::End).await.ok();
};
tokio::spawn(async move { tokio::spawn(async move {
loop { while let Some(msg) = receiver.recv().await {
let a = receiver.recv().await; if let Err(e) = ws_write.send(msg).await {
match a { failure!("Send message to server failed: {}", e);
None => {} ws_write.close().await.ok();
Some(simple_msg) => {
match simple_msg {
SimpleMessage::End => {
break; break;
} }
SimpleMessage::Msg(msg) => {
ws_write.send(msg).await.unwrap();
}
}
}
}
} }
}); });
@@ -65,30 +51,32 @@ async fn connect_to_and_loop(url: &str) -> XResult<()> {
match next { match next {
None => { None => {
information!("WebSocket ended."); information!("WebSocket ended.");
end_simple_msg_loop().await;
return Ok(()); return Ok(());
} }
Some(Err(e)) => { Some(Err(e)) => {
end_simple_msg_loop().await;
return simple_error!("WebSocket got error: {}", e); return simple_error!("WebSocket got error: {}", e);
} }
Some(Ok(message)) => { Some(Ok(message)) => {
match message { match message {
Message::Ping(msg) => { Message::Ping(msg) => {
information!("Received ping message: {:?}", msg); information!("Received ping message: {:?}", msg);
let r = sender.send(SimpleMessage::Msg(Message::Pong(msg))).await; let r = sender.send(Message::Pong(msg)).await;
r.ok(); r.ok();
} }
Message::Pong(msg) => { Message::Pong(msg) => {
information!("Received pong message: {:?}", msg); information!("Received pong message: {:?}", msg);
} }
Message::Close(close_frame) => {} Message::Close(close_frame) => {
Message::Binary(msg) => {} information!("WebSocket closed: {:?}", close_frame);
Message::Text(msg) => {} }
Message::Binary(msg) => {
information!("Received binary message: {:?}", msg);
}
Message::Text(msg) => {
information!("Received text message: {}", msg);
}
} }
} }
} }
} }
Ok(())
} }