ZBLOG

编译运行不了

如果您在编译和运行 Rust 代码时遇到问题,以下是一些常见的步骤和解决方案,可以帮助您排查并修复问题。

1. 确保依赖项已正确添加

请确保您的 Cargo.toml 文件中包含了所有必要的依赖项。以下是一个更新过的 Cargo.toml 示例:

  1. [package]
  2. name = "wss_example"
  3. version = "0.1.0"
  4. edition = "2021"
  5. [dependencies]
  6. actix-web = "4"
  7. tokio = { version = "1", features = ["full"] }
  8. tokio-tungstenite = "0.17"
  9. actix-tls = "4" # 支持 TLS
  10. rustls = { version = "0.20", features = ["dangerous_configuration"] }
  11. futures-util = "0.3" # 处理 Futures 的库

2. 检查证书文件路径

确保您在代码中指定的证书和密钥文件路径正确,并且这些文件存在。例如,替换这行代码:

  1. let certs = vec![
  2. rustls::Certificate(std::fs::read("path/to/cert.pem").unwrap()),
  3. ];
  4. let key =
  5. rustls::PrivateKey(std::fs::read("path/to/key.pem").unwrap());

确保将 "path/to/cert.pem""path/to/key.pem" 替换为实际证书和私钥文件的路径。

3. 确保使用最新版本的 Rust

您可以通过运行以下命令来更新 Rust:

  1. rustup update

4. 编译并运行项目

在项目根目录下,通过以下命令进行编译和运行:

  1. cargo build
  2. cargo run

5. 查看错误信息

如果仍然无法编译或运行,请查看终端中输出的错误信息。这些信息通常会给出导致失败的具体原因。例如,如果缺少某个库或者类型不匹配,会有明确的信息提示。

6. 示例完整代码(改进)

这是一个经过修改并更完整示例,以便于调试和理解:

  1. use actix_web::{web, App, HttpServer};
  2. use actix_tls::accept::TlsAcceptor;
  3. use futures_util::{stream::StreamExt, SinkExt}; // 添加此行以导入必要的方法
  4. use rustls::{ServerConfig, NoClientAuth};
  5. use std::sync::Arc;
  6. use tokio_tungstenite::{accept_async, tungstenite::protocol::Message};
  7. async fn websocket_handler(ws: web::Payload) -> Result<actix_web::HttpResponse, actix_web::Error> {
  8. let ws_stream = accept_async(ws).await.expect("Error accepting WebSocket connection");
  9. let (mut tx, mut rx) = ws_stream.split();
  10. while let Some(msg) = rx.next().await {
  11. match msg {
  12. Ok(Message::Text(text)) => {
  13. println!("Received: {}", text);
  14. if let Err(e) = tx.send(Message::Text(text)).await {
  15. eprintln!("Error sending message: {:?}", e);
  16. break;
  17. }
  18. },
  19. Ok(_) => {},
  20. Err(e) => {
  21. eprintln!("WebSocket error: {:?}", e);
  22. break;
  23. }
  24. }
  25. }
  26. Ok(actix_web::HttpResponse::Ok().finish())
  27. }
  28. #[tokio::main]
  29. async fn main() -> std::io::Result<()> {
  30. let mut config = ServerConfig::new(NoClientAuth);
  31. let certs = vec![
  32. rustls::Certificate(std::fs::read("cert.pem").expect("Failed to read certificate")),
  33. ];
  34. let key =
  35. rustls::PrivateKey(std::fs::read("key.pem").expect("Failed to read private key"));
  36. config.set_single_cert(certs, key).expect("Invalid certificate");
  37. let acceptor = TlsAcceptor::from(Arc::<ServerConfig>::new(config));
  38. HttpServer::new(|| {
  39. App::<_>::new()
  40. .route("/ws", web::get().to(websocket_handler))
  41. .default_service(web::__404()) // 为未匹配路由返回404
  42. })
  43. .bind_openssl("127.0.0.1:8443", acceptor)?
  44. .run()
  45. .await?;
  46. Ok(())
  47. }

请按照上述步骤检查、修改并尝试重新编译。如果有任何特定错误消息,请提供,我将根据具体情况进行进一步帮助。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=21016

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?