ZBLOG

编译运行不了

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

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

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

[package]
name = "wss_example"
version = "0.1.0"
edition = "2021"

[dependencies]
actix-web = "4"
tokio = { version = "1", features = ["full"] }
tokio-tungstenite = "0.17"
actix-tls = "4" # 支持 TLS
rustls = { version = "0.20", features = ["dangerous_configuration"] }
futures-util = "0.3" # 处理 Futures 的库

2. 检查证书文件路径

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

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

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

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

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

rustup update

4. 编译并运行项目

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

cargo build
cargo run

5. 查看错误信息

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

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

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

use actix_web::{web, App, HttpServer};
use actix_tls::accept::TlsAcceptor;
use futures_util::{stream::StreamExt, SinkExt}; // 添加此行以导入必要的方法
use rustls::{ServerConfig, NoClientAuth};
use std::sync::Arc;
use tokio_tungstenite::{accept_async, tungstenite::protocol::Message};

async fn websocket_handler(ws: web::Payload) -> Result<actix_web::HttpResponse, actix_web::Error> {
    let ws_stream = accept_async(ws).await.expect("Error accepting WebSocket connection");
    
    let (mut tx, mut rx) = ws_stream.split();

    while let Some(msg) = rx.next().await {
        match msg {
            Ok(Message::Text(text)) => {
                println!("Received: {}", text);
                if let Err(e) = tx.send(Message::Text(text)).await {
                    eprintln!("Error sending message: {:?}", e);
                    break;
                }
            },
            Ok(_) => {},
            Err(e) => {
                eprintln!("WebSocket error: {:?}", e);
                break;
            }
        }
    }

    Ok(actix_web::HttpResponse::Ok().finish())
}

#[tokio::main]
async fn main() -> std::io::Result<()> {
    let mut config = ServerConfig::new(NoClientAuth);

    let certs = vec![
        rustls::Certificate(std::fs::read("cert.pem").expect("Failed to read certificate")),
    ];
    
    let key =
        rustls::PrivateKey(std::fs::read("key.pem").expect("Failed to read private key"));

    config.set_single_cert(certs, key).expect("Invalid certificate");

    let acceptor = TlsAcceptor::from(Arc::<ServerConfig>::new(config));

    HttpServer::new(|| {
        App::<_>::new()
            .route("/ws", web::get().to(websocket_handler))
            .default_service(web::__404()) // 为未匹配路由返回404 
    })
    .bind_openssl("127.0.0.1:8443", acceptor)? 
    .run()
    .await?;

    Ok(())
}

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


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?