【发布时间】: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