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

如何基于多个本地IP在tokio-tungstenite中创建多WebSocket连接

遍历IP创建多个WebSocket连接的实现方案

要遍历所有指定IP并创建对应的WebSocket连接,你可以按照以下逻辑实现:

  1. 遍历ips列表,为每个IP构造绑定本地地址的WebSocket请求
  2. 并发处理所有连接任务,避免阻塞
  3. 为每个连接单独监听消息

以下是修改后的完整代码:

use std::net::{IpAddr, Ipv4Addr, SocketAddr};
use tokio_tungstenite::{connect_async, tungstenite::client::IntoClientRequest};
use futures::stream::FuturesUnordered;
use futures::StreamExt;

#[tokio::main]
async fn main() {
    let ips: Vec<IpAddr> = vec![
        IpAddr::V4(Ipv4Addr::new(1, 1, 1, 1)),
        IpAddr::V4(Ipv4Addr::new(2, 2, 2, 2))
    ];

    // 初始化并发任务队列
    let mut connection_tasks = FuturesUnordered::new();

    for ip in ips {
        // 构造WebSocket请求,替换为你的目标服务地址
        let mut request = IntoClientRequest::into_client_request("wss://echo.websocket.org").unwrap();
        
        // 设置请求绑定的本地IP,端口设为0表示自动分配可用端口
        let local_addr = SocketAddr::new(ip, 0);
        request.set_local_addr(local_addr).unwrap();

        // 将连接任务加入并发队列
        connection_tasks.push(async move {
            match connect_async(request).await {
                Ok((mut stream, response)) => {
                    println!("IP {} 连接成功,服务响应状态: {}", ip, response.status());
                    // 持续监听该连接的消息
                    while let Some(msg_result) = stream.next().await {
                        match msg_result {
                            Ok(msg) => println!("IP {} 收到消息: {}", ip, msg),
                            Err(e) => {
                                eprintln!("IP {} 消息接收失败: {}", ip, e);
                                break;
                            }
                        }
                    }
                }
                Err(e) => eprintln!("IP {} 连接建立失败: {}", ip, e),
            }
        });
    }

    // 等待所有连接任务执行完成
    while connection_tasks.next().await.is_some() {}
}

关键细节说明

  • 使用FuturesUnordered实现多个连接任务的并发执行,避免串行等待
  • 通过request.set_local_addr()强制指定连接使用的本地IP,确保每个连接对应指定的地址
  • 每个连接单独处理消息循环,出错时打印日志并终止该连接的监听
  • 示例中使用unwrap()是为了简化代码,实际项目中建议替换为更严谨的错误处理逻辑

内容的提问来源于stack exchange,提问作者user270199

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 18:32:37