
请教下各路大神,Flutter 连接 RabbitMQ 有人搞过吗?快崩溃了,一直报
WebSocketException: Connection to 'http://xxx.xxx.xxx.xxx/ws#' was not upgraded to websocket 《项目地址》有打包好的安卓安装包,测试账号testuser1、testuser2密码User001..,因为涉及到代码生成,如果使用不当会导致项目崩溃所以就不提供管理员账号了。
另外,贴一下代码
void onConnect(StompFrame frame) { print('onConnect'); stompClient.subscribe( destination: '/exchange/room/6', callback: (frame) { List<dynamic>? result = json.decode(frame.body!); print(result); } ); // Timer.periodic(const Duration(seconds: 10), (_) { // stompClient.send( // destination: 'ping', // body: json.encode({'a': 123}), // ); // }); } final stompClient = StompClient( config: StompConfig( useSockJS: true, url: 'ws://101.35.8.57:8005/ws', onConnect: onConnect, beforeConnect: () async { print('等待连接...'); await Future.delayed(const Duration(milliseconds: 200)); print('链接中...'); }, onWebSocketError: (dynamic error) => print(error.toString()), stompConnectHeaders: { "login": "guest", "passcode": "guest", "host": "/", }, webSocketConnectHeaders: { "login": "admin", "passcode": "admin123..", "host": "/", }, ), ); 谢谢大家,低级错误,已经解决了
报错的原因是使用了这个,把这个注释掉就发现OK了 webSocketConnectHeaders:
final stompClient = StompClient( config: StompConfig( // useSockJS: true, // 用了就收不到信息 url: 'ws://IP:端口/ws', onConnect: onConnect, beforeConnect: () async { print('链接中...'); }, onWebSocketError: (dynamic error) => print(error.toString()), // webSocketConnectHeaders: // 不要用这个,会报错 stompConnectHeaders: { 'login': '账号', 'passcode': '密码', "host": "/", }, )); dynamic onConnect(StompFrame frame) async { stompClient.subscribe( destination: '/exchange/room/6',// exchange+exchangeName+exchangeKey callback: (frame) async { print('/exchange/room/6-->'); print(utf8.decode(frame.binaryBody!.toList())); } ); } 另外body返回的是null,需要转码一下binaryBody

1 Vaspike 2022-07-20 15:47:03 +08:00 协议提升问题,这个可能要找文档看看哪里缺了配置 |
2 heybuddy 2022-07-20 16:10:52 +08:00 如果是自己的搭的是不是没有开启 rabbitmq 的 ws 插件?那个要手动打开 |
3 isSamle OP |
4 runningman 2022-07-20 16:30:35 +08:00 还是和后天 api 通讯吧。直接连 rabbitmq 貌似有点奇葩 |
5 isSamle OP @runningman 为了偷懒,用 RabbitMQ 的消息队列,监听到有新信息的时候刷新数据,之前写 h5 没啥问题 |
6 debuggerx 2022-07-20 16:53:36 +08:00 用插件 /换插件 |
8 hahastudio 2022-07-20 16:58:01 +08:00 没用过 Dart 连接 websocket ,盲猜一个 https://stackoverflow.com/questions/53721745/dart-upgrade-client-socket-to-websocket |
9 runningman 2022-07-20 17:13:45 +08:00 @isSamle 那可能用的库不一样,你找个 dart 的 stomp 的 client 试试 |
10 akaHenry 2022-07-20 23:04:55 +08:00 为什么会有 flutter 直连 rabbitmq 这样的骚操作? 在用 flutter 写 admin? 如果是用户侧, 不应该后端对 rabbitmq 进行封装, 提供更简单的 rest api or ws api 吗? |
11 brucebot 2022-07-20 23:50:48 +08:00 看来这位兄台在搞什么工业互联网项目,手机直接读还是改 mqtt 数据啊 |
12 isSamle OP @hahastudio 谢谢了,英语太水,愣是没看懂 @runningman 用了 dart_amqp 、stomp_dart_client 还是不行 @orzglory 因为想做成即时通讯,我之前写了一个 H5 版本的,用户聊天的时候,发送信息后端会给 RabbitMQ 发信息,然后其他用户监听收到有信息更新,就执行 get 请求获取新信息,但是是用 Uniapp 写的,感觉坑很多,就想改用 Flutter 写 @brucebot 不是工业互联网,是一个 Django 项目快速开发框架,想集成一些基础模块:用户权限管理,低代码工具那些已经做了点出来了,想集成一个即时通讯模块 |
13 akaHenry 2022-07-21 17:43:13 +08:00 其实不管从架构设计, 安全性, 扩展性上, 都不应该滥用 rabbitmq 自带 ws 这种特性, 来对外提供用户侧服务. 更常规的做法是比如用 go, 搭正常的 web server, 提供 ws api, go 内部对 rabbitmq 常规使用. 这样避免 rabbitmq 单机 /单集群扩容问题. 同时也容易做限流, 防止把中间件打死. (所有中间件, 都不应该对用户侧暴露) 另外, IM 类的成熟开源方案, go 社区就有很多. 直接部署, 你用 flutter 对接一下 API. 就结束了. 搭即时通讯, rabbitmq 也不是恰当选择. anyway, 如果只是为了学习, 无所谓. 你这里报错, 只是 ws 使用不当, 应该与 rabbitmq 无关(当然也可能是 rabbitmq 的 ws 插件有坑?) ws 协议本身没啥复杂性. 如果无法确定是谁的锅. 先不用 rabbitmq, 裸写 ws demo, 来排查. |
14 isSamle OP @orzglory 谢谢,不会 go,只会 python+一点点 java+一点点 flutter ,所以才想用 RabbitMQ 偷懒 |
15 huobazi 2022-07-22 16:07:03 +08:00 flutter 是做 UI 的吧,直接连 Q ? |