You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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类型,并清理同步相关的导入:

  1. 移除同步模块的导入:websocket::client::sync::Client、websocket::stream::sync::TcpStream、websocket::stream::sync::TlsStream
  2. 引入WebSocket库的异步Stream类型:websocket::r#async::TcpStream、websocket::r#async::TlsStream
  3. 修正类型标注,确保和async_connect_secure的返回类型匹配
  4. 优化错误处理,避免不必要的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 20:40:46