Actix TCP 客户端实现的编译问题

Compilation problem with Actix TCP client implementation

我对 Rust 很陌生,愿意为 Actix-web 中的 Orange Pi Zero 提供一些 Linux 服务,这将充当其他网络设备的“网关”(一些愚蠢的中国网络中继具有 4 个输入和 4 个输出,由 AT 命令通过 TCP 或 UDP 控制)并将异步轮询该设备并通过 WebSocket 将其输出转换为不断刷新的网页。我想制作 2 个不同的演员,第一个应该是 TCP 客户端演员,它通过 run_interval() 轮询中继,使用适当的 AT 命令发出网络请求,读取响应并向 WebSocket 演员发送消息将带有输入状态的消息推送到网页。 我成功地实现了 WebSocket,并尝试使用 TcpStream、FramedWrite 和 LinesCodec 实现另一个参与者。 我的 TCP 演员看起来像这样:

struct TcpClientActor {
    framed: actix::io::FramedWrite<
        String,
        WriteHalf<TcpStream>,
        LinesCodec,
    >,
}

我还有一堆其他的特性实现,编译没有任何问题,但卡在结构本身上,编译器抱怨以下错误:

the trait `tokio::io::async_write::AsyncWrite` is not implemented for `tokio::io::split::WriteHalf<tokio::net::tcp::stream::TcpStream>`

我检查了 Actix 源代码,发现已经为 WriteHalf 和 TcpStream 实现了 AsyncWrite,但无法正确编译它。

这是我 Cargo.toml 的 [dependencies] 部分:

[dependencies]
# sysfs_gpio = "0.5"
actix = "0.10"
actix-codec = "0.3"
actix-web = "3"
actix-web-actors = "3"
actix-files = "0.3"
env_logger = "0.7"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
json = "0.12"
#mio = "0.7"
tokio = { version = "0.3.1", features = ["full", "tracing"] }
tokio-util = "0.3.1"

此外,我想用 Supervisor 包装第一个 actor 来处理断开连接和其他网络问题。请提供任何示例。

感谢任何帮助。

您可能遇到了一个不幸的令人困惑的依赖冲突案例。

actix crate 依赖于 tokio 0.2.6。但是,您已将依赖项列为 tokio 0.3.1。 Cargo 认为 0.2.x 和 0.3.x 不兼容,因此将在您的项目中包含两个版本的 tokio。令人困惑的错误消息的原因是您使用的是 WriteHalf 的 0.3 版本,但 actix FramedWrite 正在执行实现 AsyncWrite.

的 0.2 版本的内容

解决方法可能是将您的 tokio 版本降级到 0.2

另请参阅: