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
相关产品推荐
相关产品推荐

