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

Flutter中能否通过HTTP方式连接WebSocket并获取响应?

Flutter中通过HTTP握手连接WebSocket并获取数据的方法

首先明确:WebSocket连接本质上是先通过HTTP/HTTPS完成握手,之后切换到WebSocket协议进行双向通信。你提到的“用HTTP方式连接”其实就是标准WebSocket连接的握手流程,之后就能通过WebSocket通道获取服务器响应数据。

下面是两种可行的实现方式:

1. 使用dart:io原生WebSocket类

无需额外依赖,直接用Flutter自带的API:

import 'dart:io';
import 'dart:convert';

void connectWebSocket() async {
  try {
    // 发起连接,底层自动完成HTTP握手
    WebSocket socket = await WebSocket.connect('ws://your-websocket-server-url');
    
    // 监听服务器发来的响应数据
    socket.listen(
      (data) {
        print('收到响应数据: $data');
        // 解析JSON格式数据(按需处理)
        var decodedData = jsonDecode(data);
        print('解析后的数据: $decodedData');
      },
      onError: (error) => print('连接出错: $error'),
      onDone: () => print('连接已关闭'),
    );
    
    // 向服务器发送请求数据(根据业务需求)
    socket.add(jsonEncode({'type': 'get_data', 'params': 'your-params'}));
    
    // 按需关闭连接
    // await socket.close();
  } catch (e) {
    print('连接失败: $e');
  }
}

2. 使用web_socket_channel包(更简洁的封装)

先在pubspec.yaml中添加依赖:

dependencies:
  web_socket_channel: ^2.4.0

然后编写代码:

import 'package:web_socket_channel/web_socket_channel.dart';
import 'dart:convert';

void connectWithChannel() {
  // 创建WebSocket通道,自动处理HTTP握手
  final channel = WebSocketChannel.connect(
    Uri.parse('ws://your-websocket-server-url'),
  );
  
  // 监听响应数据流
  channel.stream.listen(
    (data) {
      print('收到响应: $data');
      var decodedData = jsonDecode(data);
      print('解析后的数据: $decodedData');
    },
    onError: (err) => print('发生错误: $err'),
    onDone: () => print('通道已关闭'),
  );
  
  // 发送请求到服务器
  channel.sink.add(jsonEncode({'action': 'fetch_data'}));
  
  // 按需关闭通道
  // channel.sink.close();
}

额外注意事项

  • 如果服务器是HTTPS环境,要使用wss://开头的地址(加密WebSocket连接)。
  • 握手阶段需要自定义HTTP请求头(比如携带认证token),可以通过headers参数添加:
    // 原生WebSocket方式
    WebSocket socket = await WebSocket.connect(
      'ws://your-server',
      headers: {'Authorization': 'Bearer your-token'},
    );
    
    // web_socket_channel方式
    final channel = WebSocketChannel.connect(
      Uri.parse('ws://your-server'),
      headers: {'Authorization': 'Bearer your-token'},
    );
    
  • 服务器端必须正确处理WebSocket的HTTP握手请求,返回101 Switching Protocols状态码,才能进入后续的WebSocket通信阶段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 20:27:49