V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
isSamle
V2EX  ›  Android

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

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

    请教下各路大神,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   ·   我们的愿景   ·   实用小工具   ·   1199 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 18:02 · PVG 02:02 · LAX 11:02 · JFK 14:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.