Как отправить поток сообщений веб-сокета с помощью метода send_all токио-вольфрамита - PullRequest
1 голос
/ 29 сентября 2019

Я использую отличную библиотеку Tokio-Tungstenite для веб-сокета ржавчины, которая является просто версией вольфрамита Tokio.

Я могу легко подключиться к потоку веб-сокетов с помощью метода connect_async, и в потоке веб-сокетов я получаю обратноЯ разделил это следующим образом:

connect_async(url).and_then(move |(ws_stream, _)| {

        let (sink, stream) = ws_stream.split();

Я могу легко отправить одно сообщение в приемник, используя следующее сообщение:

sink.send(tungstenite::Message::Text("my message".to_string()))
.map_err(|e| ())
.wait();

Это всего лишь надуманный пример.Моя проблема в том, что я хочу отправить поток сообщений в приемник, который, как я узнал, лучше всего выполнить с помощью метода send_all.Моя попытка:

let my_messsages : Vec<tungstenite::Message> = vec![
tungstenite::Message::Text("message_1".to_string()), 
tungstenite::Message::Text("message_2".to_string()) ];

let send_stream: tokio_tungstenite::WebSocketStream
<tokio_tungstenite::tungstenite::Message> 
= futures::stream::iter_ok(my_messages);

sink.send_all(stream).map_err(|e| ()).wait();

Но это не работает, потому что futures :: stream :: iter_ok не является правильным способом создания нужного мне потока, в котором я застрял и не могусм., как исходить из документации.

Редактировать: Первоначально я не указывал аннотацию типа для send_stream, и она выдала мне эту ошибку:

type annotations needed for `futures::stream::iter_ok::IterOk
<std::vec::IntoIter<tungstenite::protocol::message::Message>, E>`

cannot infer type for `E`

Текущая ошибка также должна быть сделанас аннотациями типов для потока отправки.

1 Ответ

1 голос
/ 29 сентября 2019

Ваша проблема лежит прямо в этой строке:

let send_stream:tokio_tungstenite::WebSocketStream<tokio_tungstenite::tungstenite::Message> 
    = futures::stream::iter_ok(my_messages);

Определение futures::stream::iter_ok выглядит следующим образом:

pub fn iter_ok<I, E>(i: I) -> IterOk<<I as IntoIterator>::IntoIter, E> 
where
    I: IntoIterator, 

Обратите внимание, что этот новый потокIterOk, а не tungstenite::WebsocketStream.Вынуждая тип (с вашими аннотациями), вы заставляете компилятор искать реализацию Into<WebsocketStream> для IterOk, которой нет.

В результате это не удается.

Этот тип подсказки совершенно не нужен, поскольку send_all определен для impl Sink<SinkItem = _, SinkError = _>.

. Не удивительно, что изменение строки на:

let send_stream = futures::stream::iter_ok(my_messages)
  .map_err(|_:()| tungstenite::error::Error::Utf8)

должно работать без сбоев, так какваш приемник ожидает tungstenite::Message, и этот новый поток имеет его как элемент (как он был построен из Vec<tungstenite::Message>).map_err существует исключительно для принуждения типов и на практике никогда не будет вызываться .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...