
[英]Rust lazy_static and tokio::sync::mpsc::channel in tokio::select
[英]Forwarding data to a Tokio mpsc channel from a stream
我正在尝试创建一个异步Rust客户端,该客户端连接到一端的WebSocket服务器和另一端的蓝牙加密狗。 在这两者之间,会有一些逻辑来过滤消息。
我在WebSocket端使用rust-websocket的async模块。
我想隔离三个组件(websocket发送/接收,蓝牙发送/接收,消息处理)。 为了做到这一点,我想使用futures::sync::mpsc
通道作为Sink
,以便将消息从WebSocket接收器传递到循环的消息处理部分。 以下是我的代码的简化部分:
const CONNECTION: &'static str = "ws://127.0.0.1:4000/socket/websocket";
fn main() {
let mut core = Core::new().unwrap();
let (ws_send, ws_recv) = mpsc::channel(100);
let (ws_to_main, main_from_ws) = mpsc::channel(100);
let ws_future = ClientBuilder::new(CONNECTION)
.unwrap()
.add_protocol("rust-websocket")
.async_connect_insecure(&core.handle())
.and_then(|(duplex, _)| {
let (mut sink, stream) = duplex.split();
stream
.filter_map(|message| {
println!("Received Message: {:?}", message);
match message {
OwnedMessage::Close(e) => Some(OwnedMessage::Close(e)),
OwnedMessage::Ping(d) => Some(OwnedMessage::Pong(d)),
OwnedMessage::Text(msg) => Some(OwnedMessage::Text(msg)),
_ => None,
}
})
.forward(ws_to_main)
});
let result = core.run(ws_future).unwrap();
}
但是,当我运行此代码时,我收到一些错误消息,如下所示:
error[E0277]: the trait bound `websocket::WebSocketError: std::convert::From<futures::sync::mpsc::SendError<websocket::OwnedMessage>>` is not satisfied
--> src/main.rs:103:22
|
103 | .forward(ws_to_main)
| ^^^^^^^ the trait `std::convert::From<futures::sync::mpsc::SendError<websocket::OwnedMessage>>` is not implemented for `websocket::WebSocketError`
|
= help: the following implementations were found:
<websocket::WebSocketError as std::convert::From<std::io::Error>>
<websocket::WebSocketError as std::convert::From<hyper::error::Error>>
<websocket::WebSocketError as std::convert::From<websocket::client::ParseError>>
<websocket::WebSocketError as std::convert::From<native_tls::Error>>
and 5 others
我试图用.map_err
,将错误转换为SendError
,但是SendError
结构是私有的。
一种快速的解决方案是将蒸汽和水槽的错误类型转换为相同的类型:
stream
.map_err(|err| eprintln!("stream error: {}", err))
.forward(sink.sink_map_err(|err| eprintln!("sink error: {}", err)))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.