Rust异步WebSocket编程遇类型不匹配错误求助
Rust异步WebSocket编程的E0308类型不匹配错误解决
你遇到的问题是混用了WebSocket库的同步与异步Stream类型,导致async_connect_secure返回的异步TlsStream和你标注的同步TlsStream类型不兼容。以下是具体分析和修复方案:
问题代码
use native_tls::TlsConnector; use websocket::client::sync::Client; use websocket::client::ParseError; use websocket::futures::{Future, Sink, Stream}; use websocket::r#async::client::ClientNew; use websocket::stream::sync::TcpStream; use websocket::stream::sync::TlsStream; use websocket::ClientBuilder; use websocket::OwnedMessage; use websocket::WebSocketError; fn main() { let twitch_websocket_url: &str = "lol"; let tls_connector: native_tls::Result<TlsConnector> = TlsConnector::new(); if let Err(error) = tls_connector.as_ref() { println!("Error: {}", error); } let client_builder: Result<ClientBuilder, ParseError> = ClientBuilder::new(&twitch_websocket_url); if let Err(parse_error) = client_builder.as_ref() { println!("Error: {}", parse_error); } // Get future for async connection. let future_conn: ClientNew<TlsStream<TcpStream>> = client_builder .unwrap() .async_connect_secure(Some(tls_connector.unwrap())); if let Err(wserror) = future_conn.as_ref() { println!("Error: {}", wserror); } }
错误信息
error[E0308]: mismatched types --> src/main.rs:28:53 | 28 | let future_conn: ClientNew<TlsStream<TcpStream>> = client_builder.unwrap() | ______________________-------------------------------___^ | | | | | expected due to this 29 | | .async_connect_secure(Some(tls_connector.unwrap())); | |___________________________________________________________^ expected struct `native_tls::TlsStream`, found struct `websocket::client::r#async::TlsStream` |
修复方案
核心是统一使用异步版本的Stream类型,并清理同步相关的导入:
- 移除同步模块的导入:
websocket::client::sync::Client、websocket::stream::sync::TcpStream、websocket::stream::sync::TlsStream - 引入WebSocket库的异步Stream类型:
websocket::r#async::TcpStream、websocket::r#async::TlsStream - 修正类型标注,确保和
async_connect_secure的返回类型匹配 - 优化错误处理,避免不必要的
unwrap
修正后的代码
use native_tls::TlsConnector; use websocket::client::ParseError; use websocket::futures::{Future, Sink, Stream}; use websocket::r#async::client::ClientNew; use websocket::r#async::{TcpStream, TlsStream}; use websocket::ClientBuilder; use websocket::WebSocketError; fn main() { let twitch_websocket_url: &str = "wss://irc-ws.chat.twitch.tv:443"; // 创建TLS连接器,简化错误处理 let tls_connector = match TlsConnector::new() { Ok(conn) => conn, Err(error) => { eprintln!("TLS连接器创建失败: {}", error); return; } }; // 解析WebSocket URL let client_builder = match ClientBuilder::new(twitch_websocket_url) { Ok(builder) => builder, Err(parse_error) => { eprintln!("URL解析失败: {}", parse_error); return; } }; // 获取异步连接Future,使用异步版本的TlsStream let future_conn: ClientNew<TlsStream<TcpStream>> = client_builder .async_connect_secure(Some(tls_connector)); // 注意:异步Future需要运行时驱动,比如使用tokio // 示例:添加tokio依赖后,用以下代码执行Future // tokio::run(future_conn.then(|result| { // match result { // Ok((client, response)) => { // println!("连接成功: {:?}", response); // // 后续可处理客户端的发送/接收逻辑 // Ok(()) // } // Err(e) => { // eprintln!("连接失败: {}", e); // Err(e) // } // } // })); }
关键说明
async_connect_secure是异步API,返回的是WebSocket库异步模块下的TlsStream,而非同步模块的类型,必须对应导入异步版本的Stream- 异步Future无法在
main函数中直接执行,需要依赖异步运行时(如tokio),代码中注释了如何驱动Future的示例 - 避免滥用
unwrap,使用match或if let处理错误,提升代码健壮性
内容的提问来源于stack exchange,提问作者Noah Fletcher
相关产品推荐
相关产品推荐

