请教下各路大神, Flutter 连接 RabbitMQ 有人搞过吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
isSamle
0.04D
V2EX    Android

请教下各路大神, Flutter 连接 RabbitMQ 有人搞过吗?

  •  
  •   isSamle 2022-07-20 14:56:20 +08:00 13496 次点击
    这是一个创建于 1249 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请教下各路大神,Flutter 连接 RabbitMQ 有人搞过吗?快崩溃了,一直报

    WebSocketException: Connection to 'http://xxx.xxx.xxx.xxx/ws#' was not upgraded to websocket 
    第 1 条附言    2022-07-21 10:11:00 +08:00

    《项目地址》有打包好的安卓安装包,测试账号testuser1testuser2密码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": "/", }, ), ); 
    第 2 条附言    2022-07-21 21:19:05 +08:00

    谢谢大家,低级错误,已经解决了

    报错的原因是使用了这个,把这个注释掉就发现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

    第 3 条附言    2022-07-21 21:23:53 +08:00

    16 条回复    2022-07-22 22:37:37 +08:00
    Vaspike
        1
    Vaspike  
       2022-07-20 15:47:03 +08:00
    协议提升问题,这个可能要找文档看看哪里缺了配置
    heybuddy
        2
    heybuddy  
       2022-07-20 16:10:52 +08:00
    如果是自己的搭的是不是没有开启 rabbitmq 的 ws 插件?那个要手动打开
    isSamle
        3
    isSamle  
    OP
       2022-07-20 16:12:30 +08:00
    @Vaspike 我太水了,试了两天了
    @heybuddy 开了,我用 vue 和 uniapp 写的 stomp 连接都没问题,就是 Flutter 不行
    runningman
        4
    runningman  
       2022-07-20 16:30:35 +08:00
    还是和后天 api 通讯吧。直接连 rabbitmq 貌似有点奇葩
    isSamle
        5
    isSamle  
    OP
       2022-07-20 16:36:58 +08:00
    @runningman 为了偷懒,用 RabbitMQ 的消息队列,监听到有新信息的时候刷新数据,之前写 h5 没啥问题
    debuggerx
        6
    debuggerx  
       2022-07-20 16:53:36 +08:00
    用插件 /换插件
    isSamle
        7
    isSamle  
    OP
       2022-07-20 16:55:56 +08:00
    @debuggerx 枯了 能搜到的插件都试了
    hahastudio
        8
    hahastudio  
       2022-07-20 16:58:01 +08:00
    runningman
        9
    runningman  
       2022-07-20 17:13:45 +08:00
    @isSamle 那可能用的库不一样,你找个 dart 的 stomp 的 client 试试
    akaHenry
        10
    akaHenry  
       2022-07-20 23:04:55 +08:00
    为什么会有 flutter 直连 rabbitmq 这样的骚操作?

    在用 flutter 写 admin?

    如果是用户侧, 不应该后端对 rabbitmq 进行封装, 提供更简单的 rest api or ws api 吗?
    brucebot
        11
    brucebot  
       2022-07-20 23:50:48 +08:00
    看来这位兄台在搞什么工业互联网项目,手机直接读还是改 mqtt 数据啊
    isSamle
        12
    isSamle  
    OP
       2022-07-21 09:15:28 +08:00
    @hahastudio 谢谢了,英语太水,愣是没看懂
    @runningman 用了 dart_amqp 、stomp_dart_client 还是不行
    @orzglory 因为想做成即时通讯,我之前写了一个 H5 版本的,用户聊天的时候,发送信息后端会给 RabbitMQ 发信息,然后其他用户监听收到有信息更新,就执行 get 请求获取新信息,但是是用 Uniapp 写的,感觉坑很多,就想改用 Flutter 写
    @brucebot 不是工业互联网,是一个 Django 项目快速开发框架,想集成一些基础模块:用户权限管理,低代码工具那些已经做了点出来了,想集成一个即时通讯模块
    akaHenry
        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, 来排查.
    isSamle
        14
    isSamle  
    OP
       2022-07-21 21:16:59 +08:00
    @orzglory 谢谢,不会 go,只会 python+一点点 java+一点点 flutter ,所以才想用 RabbitMQ 偷懒
    huobazi
        15
    huobazi  
       2022-07-22 16:07:03 +08:00
    flutter 是做 UI 的吧,直接连 Q ?
    isSamle
        16
    isSamle  
    OP
       2022-07-22 22:37:37 +08:00
    @huobazi 灵机一动想到的,长链接监听信息更新来实现即时通讯
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2532 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 10:15 PVG 18:15 LAX 02:15 JFK 05:15
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86