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); } }
なるほど、これは面白い。