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

Flutter与.Net Core WebSocket连接失败问题求助

Flutter与.NET Core WebSocket连接失败的排查与解决

我之前也踩过Flutter和.NET Core WebSocket连接的坑,结合你的报错信息,给你梳理几个关键排查方向和解决方案:

一、先确认.NET Core服务器端配置是否正确

1. 正确启用WebSocket中间件

不管是.NET 6+的Program.cs还是旧版本的Startup.cs,都必须先启用WebSocket支持:

  • .NET 6+ Program.cs示例:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

// 必须在路由之前添加WebSocket中间件
app.UseWebSockets();

// 配置WebSocket端点
app.Map("/ws", async context =>
{
    if (!context.WebSockets.IsWebSocketRequest)
    {
        context.Response.StatusCode = StatusCodes.Status400BadRequest;
        return;
    }

    // 接受WebSocket连接
    var webSocket = await context.WebSockets.AcceptWebSocketAsync();
    // 这里可以添加消息接收、发送的逻辑,比如循环监听消息
    var buffer = new byte[1024 * 4];
    var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
    while (!result.CloseStatus.HasValue)
    {
        // 处理收到的消息,示例:原样返回
        await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None);
        result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
    }
    await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
});

app.Run("http://0.0.0.0:5000");

2. 处理跨域问题

如果你的Flutter App在本地模拟器调试,服务器必须允许跨域请求,否则会被拦截:

// 在Program.cs中添加CORS配置
builder.Services.AddCors(options =>
{
    options.AddPolicy("WebSocketCors", policy =>
    {
        policy.AllowAnyOrigin()
              .AllowAnyMethod()
              .AllowAnyHeader()
              // 针对Android模拟器,主机localhost对应10.0.2.2,需要加入允许列表
              .WithOrigins("http://10.0.2.2:6000", "http://localhost:6000")
              .SetIsOriginAllowedToAllowWildcardSubdomains();
    });
});

// 在UseWebSockets之后、Map端点之前启用CORS
app.UseCors("WebSocketCors");

二、排查Flutter客户端的问题

1. 修正连接URL

  • Android模拟器无法直接访问主机的localhost,必须替换为10.0.2.2(这是Android模拟器映射主机localhost的特殊地址)
  • iOS模拟器可以直接用localhost或127.0.0.1
  • 正确的连接URL示例:ws://10.0.2.2:5000/ws

2. 检查客户端代码与权限

确保你用的是正确的WebSocket客户端实现,比如web_socket_channel包:

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

void initWebSocketConnection() {
  try {
    // 替换成你的服务器地址
    final channel = IOWebSocketChannel.connect('ws://10.0.2.2:5000/ws');

    // 监听消息
    channel.stream.listen(
      (message) {
        print('收到服务器消息: $message');
      },
      onError: (error) {
        print('连接错误: $error');
      },
      onDone: () {
        print('连接已关闭');
      },
    );

    // 发送测试消息
    channel.sink.add('Flutter客户端请求连接');
  } catch (e) {
    print('连接失败: $e');
  }
}

另外,别忘了配置权限:

  • Android:在AndroidManifest.xml中添加网络权限
<uses-permission android:name="android.permission.INTERNET" />
  • iOS:如果服务器用的是HTTP(非HTTPS),需要在Info.plist中允许非安全连接:
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

三、用工具验证服务器可用性

先排除服务器本身的问题,用wscat(需要先安装Node.js,然后npm install -g wscat)测试:

wscat -c ws://localhost:5000/ws

如果能成功连接并收发消息,说明服务器没问题,问题集中在Flutter客户端;如果连接失败,就回到服务器端排查端口、防火墙、中间件配置。

四、额外注意点

  • 确保服务器的端口(比如5000)没有被防火墙或杀毒软件拦截
  • 如果服务器部署在远程,要确认公网IP和端口是否对外开放
  • 调试时可以打开Flutter的详细日志,查看更具体的错误信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:09:30