请教下各路大神,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 ?
|