websocketで通信して、connection errorや、通信内容の処理でのエラーハンドリング
以下のように書くと、接続先のURLにミスがあった場合もerrorを返してくれる。
#[tokio::main]
async fn main() {
let url = format!("wss://echo.websocket.org/");
// let url = format!("wss://echo.aaaaaaa.org/");
let res = web_socket(url).await;
match res {
Ok(_) => {
println!("wsに成功しました!");
}
Err(error) => {
println!("wsに失敗");
println!("{}", error);
}
}
}
async fn web_socket(url: String) -> Result<(), Box<dyn std::error::Error>> {
let mut ws = WebSocket::connect(&url).await?;
ws.send_text("foo".to_string()).await?;
ws.receive().await?;
if let Frame::Text { payload: received_msg, .. } = ws.receive().await? {
println!("{}", received_msg);
if received_msg != "hoge" {
let error = "メッセージの照合に失敗しました。".to_string();
return Err(error.into());
}
}
ws.close(None).await?;
Ok(())
}
– connectionエラー
Finished `dev` profile [unoptimized + debuginfo] target(s) in 2.17s
Running `target/debug/app`
wsに失敗
could not parse into SocketAddrs
– ソケット通信での内容でのエラーを明示的にエラーとして知らせる
Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.81s
Running `target/debug/app`
foo
wsに失敗
メッセージの照合に失敗しました。
– 成功時
Finished `dev` profile [unoptimized + debuginfo] target(s) in 2.58s
Running `target/debug/app`
foo
wsに成功しました!
以下のような書き方はできない。
let mut ws = WebSocket::connect(&url).await?;
match ws {
Ok(_) => {
println!("wsに成功しました!");
}
Err(error) => {
println!("wsに失敗");
println!("{}", error);
}
}
なるほど、これは面白い。