【问题标题】:Compilation problem with Actix TCP client implementationActix TCP 客户端实现的编译问题
【发布时间】:2020-11-11 11:28:28
【问题描述】:

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

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

我还有一堆其他的 trait 实现,它们编译时没有任何问题,但卡在 struct 本身,编译器抱怨以下错误:

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 以处理断开连接和其他网络问题。请提供任何示例。

将不胜感激。

【问题讨论】:

    标签: rust actix-web rust-actix


    【解决方案1】:

    您可能遇到了一个令人遗憾的、令人困惑的依赖关系冲突案例。

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

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

    另请参阅:Why is a trait not implemented for a type that clearly has it implemented?

    【讨论】:

    • 感谢您的回答。是的,我已经怀疑并尝试降级 tokio,但在这种情况下,我面临着许多其他编译错误。
    • 如果没有更具体的信息,我无法帮助您。如果降级解决了这个特定问题,那么我已经回答了您发布的问题。我无法预测修复是否会导致更多问题,因为我看不到您的代码。我建议您使用您的代码发布一个新问题,以便您获得更好的解决方案。
    • 0.2 到 0.3 之间的 a number of changes 可能需要通过降级来解决。
    • 好的,降级后错误消失了,现在我在尝试附加流时遇到了这个错误:ctx.add_stream(FramedRead::new(r, LinesCodec::new())); 错误:type mismatch resolving &lt;tokio_util::codec::framed_read::FramedRead&lt;tokio::io::split::ReadHalf&lt;tokio::net::tcp::stream::TcpStream&gt;, tokio_util::codec::lines_codec::LinesCodec&gt; as futures_core::stream::Stream&gt;::Item == std::string::String
    • 我认为FramedRead as StreamItemResult&lt;String, _&gt; 而不仅仅是String,我不知道这个约束来自哪里
    猜你喜欢
    • 2014-07-15
    • 2012-10-24
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 2022-01-22
    相关资源
    最近更新 更多