問題

我正在使用優秀的rust websocket庫tokiotunte,這只是Tuntenite的tokio版本.

我可以使用connect_async方法輕鬆連線到websocket流,在websocket流中,我得到回來,我將其拆分如下:

 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();
 

但它不起作用,因為期貨::流:: 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`
 

當前的錯誤也與傳送流的型別註釋有關。

  最佳答案

你的問題完全在這條線上:

 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純粹是為了脅迫型別,並且在實踐中永遠不會被呼叫.

  相同標籤的其他問題

rust