在tokio-tungstenite下一个原因退出

In tokio-tungstenite next cause exit

我正在使用 tokio-tungstenite 访问服务器。 不幸的是,读取操作不起作用,程序以错误代码 0 退出,因此先验没有错误。一个简化的代码(虽然“...”不是我使用的代码)是

use tokio_tungstenite::connect_async;
use futures_util::StreamExt;
use futures_util::SinkExt;

#[tokio::main]
async fn main() {
  let url_name = "wss://...";
  let (ws_stream, _) = connect_async(url_name).await.unwrap();
  let (mut write, mut read) = ws_stream.split();
  tokio::spawn(async move {
    let ent = read.next().await;
    println!("We have ent");
  });
  write.send(tokio_tungstenite::tungstenite::Message::Text("...".to_string())).await;
}

我期望的错误程序的行为是读取挂起或 entNone 或者如果not None 包含我可以解释的内部错误。但是没有程序在没有错误消息的情况下退出。

除了问题的直接问题,还有什么调试方法可以帮助理解 tokio 中发生的事情?

您的程序在 write.send(...) 未来产生结果后退出。此结果被丢弃,因此它不会影响程序的退出代码。

编译器实际上会针对未使用的结果发出警告,提示您应该处理它。

如果你想冒泡你的写操作的错误状态,你可以unwrap()它的结果return。如果写入底层 WebSocket 失败,您的程序将崩溃并退出。

如果写操作成功,而你想等待读操作,你需要绑定 JoinHandle return 由 tokio::spawn 编辑到一个变量并等待它, 即

  let handle = tokio::spawn(async move {
    let ent = read.next().await.expect("Stream ended").expect("Error while reading");
    println!("We have ent");
  });
    write.send(tokio_tungstenite::tungstenite::Message::Text("...".to_string())).await.expect("Failed to write the message");
  handle.await.expect("The read task failed.");

如果底层任务发生恐慌,handle 的未来将 return 出错,如果读取操作失败就会出现这种情况。