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

Flutter如何将JSON以字节形式发送至WebSocket服务器?

解决Dart/Flutter中WebSocket发送JSON格式消息的问题

你的问题出在直接把Dart的Map对象传给了WebSocket的sink——服务器需要的是标准JSON格式的字符串(或对应的UTF-8字节),而不是Dart原生的Map实例,这就是服务器拒绝识别的核心原因。

下面是和Python实现逻辑完全对应的Dart解决方案:

步骤1:导入必要的库

首先要导入dart:convert,它提供了JSON序列化和UTF-8编码的工具方法:

import 'dart:convert';

步骤2:修改消息发送逻辑

你可以保持getHiMsg方法不变,只需要在发送前把Map序列化为JSON字符串,再根据需要转成UTF-8字节(和Python的json.dumps+bytes操作对应)。

方式一:直接发送JSON字符串(推荐,更简洁)

WebSocket的sink.add支持直接传入字符串,底层会自动把它编码为UTF-8字节:

void _sayHi() async {
  _token = await _prefs.getToken();
  _userAddr = await _prefs.getUserAddr();
  var hi = getHiMsg(_token, _userAddr);
  
  // 将Dart Map序列化为标准JSON字符串
  String hiJson = jsonEncode(hi);
  print(hiJson); // 可以打印确认格式是否正确
  
  channel.sink.add(hiJson);
}

方式二:发送UTF-8字节数组(完全匹配Python的实现)

如果服务器明确要求接收字节流,可以把JSON字符串转成UTF-8编码的字节数组:

void _sayHi() async {
  _token = await _prefs.getToken();
  _userAddr = await _prefs.getUserAddr();
  var hi = getHiMsg(_token, _userAddr);
  
  String hiJson = jsonEncode(hi);
  // 把JSON字符串转成UTF-8字节数组,对应Python的bytes(msg_str, 'utf-8')
  List<int> hiBytes = utf8.encode(hiJson);
  
  channel.sink.add(hiBytes);
}

关键说明

  • jsonEncode:对应Python的json.dumps,负责把Dart的Map转换成符合RFC标准的JSON字符串。
  • utf8.encode:对应Python的bytes(msg_str, 'utf-8'),负责把字符串转换成UTF-8编码的字节序列。
  • 发送前可以打印hiJson确认格式,确保它是类似这样的标准JSON:
    {"msg_type":"hi","payload":{"token":"your_token","user_addr":"your_addr","ua":"dart/flutter-v0.0.1","device":"Phone","location":"Hunan"}}
    

这样修改后,服务器就能正确识别你的JSON请求了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:21:37