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

Flutter web_socket_channel连接Socket.IO服务静默失败无响应问题

问题原因
  • 核心不兼容问题:你的服务端基于Flask-SocketIO搭建,实现的是Socket.IO协议,它是WebSocket之上的上层封装协议,有独立的握手规则、消息帧格式、事件机制,和原生WebSocket不兼容。你在HTML端用的是官方Socket.IO客户端库,所以可以正常通信,但Flutter端用的web_socket_channel是原生WebSocket客户端,发送的消息不符合Socket.IO的格式要求,服务端无法识别处理,因此不会触发消息回调,也不会抛出可见错误。
  • 代码逻辑缺陷:你的FluttersendMessage方法每次调用都会新建一个WebSocket连接,调用sink.add后直接结束方法,连接实例没有被持有,会被系统回收,很可能消息还没完成发送就被销毁,就算对接原生WebSocket服务端也可能出现收不到消息的情况。
解决方案

方案1:Flutter端适配Socket.IO协议(推荐,无需修改现有服务端代码)

  1. 先在pubspec.yaml中添加Socket.IO客户端依赖:
dependencies:
  flutter:
    sdk: flutter
  socket_io_client: ^2.0.3
  1. 替换原有WebSocket相关逻辑,调整后的代码如下:
import 'package:flutter/material.dart';
import 'package:socket_io_client/socket_io_client.dart' as IO;

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);
  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late IO.Socket socket;

  @override
  void initState() {
    super.initState();
    // 初始化Socket连接,参数和HTML端逻辑对齐
    socket = IO.io('http://192.1XX.XX.XX:5000', <String, dynamic>{
      'transports': ['websocket'],
      'autoConnect': false,
    });
    socket.connect();
    // 可选添加事件监听,方便排查问题
    socket.on('connect', (_) => print('Socket连接成功'));
    socket.on('message', (msg) => print('收到服务端消息: $msg'));
    socket.on('disconnect', (_) => print('Socket连接断开'));
    socket.on('error', (err) => print('Socket出错: $err'));
  }

  void sendMessage(String message) {
    socket.emit('message', message);
  }

  @override
  void dispose() {
    // 页面销毁时断开连接
    socket.disconnect();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            const Text('Dor'),
            TextButton(
              onPressed: () {
                sendMessage('Message text should go here');
              },
              child: const Text('PressMe'),
            )
          ],
        ),
      ),
    );
  }
}

方案2:服务端改为原生WebSocket实现(无需修改现有Flutter端逻辑)

如果不需要Socket.IO的额外能力,可以将Flask服务端替换为原生WebSocket实现,例如使用flask-sockets库开发原生WebSocket接口,同时调整Flutter端的连接持有逻辑,避免连接提前被回收即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:15:04