【问题标题】:Flutter stomp client cant connect with spring stomp clientFlutter stomp客户端无法与spring stomp客户端连接
【发布时间】:2020-10-08 10:23:19
【问题描述】:

我是 Flutter 的新手。我正在尝试连接到使用 stomp 的 spring websocket,但连接失败。我正在使用 stomp_dart_client 0.3.3。弹簧服务器工作正常。我可以在浏览器上看到消息。

这是我的 spring 实现:

Spring 配置类:

@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
    config.enableSimpleBroker("/topic");
    config.setApplicationDestinationPrefixes("/app");
}

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/gs-guide-websocket").withSockJS();
}

弹簧控制器:

@MessageMapping("/hello")
@SendTo("/topic/greetings")
public Greeting greeting(HelloMessage message) throws Exception {
    Thread.sleep(1000); // simulated delay
    return new Greeting("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!");
}

Flutter 实现:

StompClient stompClient = StompClient(
        config: StompConfig(
          url: 'ws://10.0.2.2:7000',
          onConnect:(ss, dd)=> ss.subscribe (
            destination: '/topic/greetings/gs-guide-websocket',
            callback: (StompFrame frame) {
              print(frame.body);
            },
          ),
          onWebSocketError: (dynamic error) => print(error.toString()),
          onStompError: (d) => print("stomp error"),
          onDisconnect: (d)=> print("disconnect"),
        ));

   stompClient.activate();

   stompClient.subscribe (
        destination: '/topic/greetings',
        callback: (StompFrame frame) {
          print(frame.body);
          List<dynamic> result = json.decode(frame.body);
          return result;
        },
    );

这是错误:

E/flutter (30825): [ERROR:flutter/shell/common/shell.cc(213)] Dart Error: Unhandled exception:
E/flutter (30825): NoSuchMethodError: The method 'subscribe' was called on null.
E/flutter (30825): Receiver: null
E/flutter (30825): Tried calling: subscribe(callback: Closure: (StompFrame) => List<dynamic>, destination: "/topic/greetings", headers: null)
E/flutter (30825): #0      Object.noSuchMethod (dart:core-patch/object_patch.dart:53:5)
E/flutter (30825): #1      StompClient.subscribe (package:stomp_dart_client/stomp.dart:74:21)
E/flutter (30825): #2      _MyHomePageState._receivedMessage (package:tutorial_projecect/main.dart:154:16)
E/flutter (30825): #3      _MyHomePageState.build (package:tutorial_projecect/main.dart:90:41)
E/flutter (30825): #4      StatefulElement.build (package:flutter/src/widgets/framework.dart:4619:28)
E/flutter (30825): #5      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4502:15)
E/flutter (30825): #6      StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4675:11)
E/flutter (30825): #7      Element.rebuild (package:flutter/src/widgets/framework.dart:4218:5)
E/flutter (30825): #8      StatefulElement.update (package:flutter/src/widgets/framework.dart:4707:5)
E/flutter (30825): #9      Element.updateChild (package:flutter/src/widgets/framework.dart:3201:15)
E/flutter (30825): #10     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5837:14)
E/flutter (30825): #11     Element.updateChild (package:flutter/src/widgets/framework.dart:3201:15)
E/flutter (30825): #12     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4527:16)
E/flutter (30825): #13     Element.rebuild (package:flutter/src/widgets/framework.dart:4218:5)
E/flutter (30825): #14     StatelessElement.update (package:flutter/src/widgets/framework.dart:4583:5)
E/flutter (30825): #15     Element.updateChild (package:flutter/src/widgets/framework.dart:3201:15)
E/flutter (30825): #16     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5837:14)
E/flutter (30825): #17     Element.updateChild (package:flutter/src/widgets/framework.dart:3201:15)
E/flutter (30825): #18     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5837:14)
E/flutter (30825): #19     Element.updateChild (package:flutter/src/widgets/framework.dart:3201:15)
E/flutter (30825): #20     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4527:16)
E/flutter (30825): #21     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4675:11)
E/flutter (30825): #22     Element.rebuild (package:flutter/src/widgets/framework.dart:4218:5)
E/flutter (30825): #23     StatefulElement.update (package:flutter/src/widgets/framework.dart:4707:5)
E/flutter (30825): #24     Element.updateChild (package:flutter/src/widgets/framework.dart:3201:15)
E/flutter (30825): #25     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5837:14)
E/flutter (30825): #26     Element.updateChild (package:flutter/src/widgets/framework.dart:3201:15)
E/flutter (30825): #27     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5837:14)
E/flutter (30825): #28     Element.updateChild (package:flutter/src/widgets/framework.dart:3201:15)
E/flutter (30825): #29     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4527:16)
E/flutter (30825): #30     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4675:11)
E/flutter (30825): #31     Element.rebuild (package:flutter/src/widgets/framework.dart:4218:5)
E/flutter (30825): #32     StatefulElement.update (package:flutter/src/widgets/framework.dart:4707:5)
E/flutter (30825): #33     Element.updateChild (package:flutter/src/widgets/framework.dart:3201:15)
E/flutter (30825): #34     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4527:16)
E/flutter (30825): #35     Element.rebuild (package:flutter/src/widgets/framework.dart:4218:5)
E/flutter (30825): #36     StatelessElement.update (package:flutter/src/widgets/framework.dart:4583:5)
E/flutter (30825): #37     Element.updateChild (package:flutter/src/widgets/framework.dart:3201:15)
E/flutter (30825): #38     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4527:16)
E/flutter (30825): #39     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4675:11)
E/flutter (30825): #40     Element.rebuild (package:flutter/src/widgets/framework.dart:4218:5)
E/flutter (30825): #41     StatefulElement.update (package:flutter/src/widgets/framework.dart:4707:5)
E/flutter (30825): #42     Element.updateChild (package:flutter/src/widgets/framework.dart:3201:15)
E/flutter (30825): #43     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5837:14)
E/flutter (30825): #44     Element.updateCh

【问题讨论】:

    标签: java spring flutter dart stomp


    【解决方案1】:

    经过一些调查和重试,我发现了问题。 registerStompEndpoints 不应返回 SockJs。

    我使用了另一个 stomp 库:stomp: ^0.8.0

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/gs-guide-websocket");
    }
    

    【讨论】:

    • 嗨,赛德!我也是 Flutter 的新手,我正在努力做你所做的事情。您是否遵循了可以发给我的任何教程?谢谢!
    • 嗨@GuilhermeOliveira,我在这里关注了这个,现在使用 Flutter stomp 客户端很好。 pub.dev/packages/stomp_dart_client/example
    【解决方案2】:

    首先。

    您的原始帖子应在 onConnect 回调中使用 stompClient.subscribe。如果在连接前订阅,则客户端对象为空。

    其次。

    自从你改变了一个库。你应该展示你的新代码。我已经尝试过这两个库。跺脚:^0.8.0 给出

    java.lang.IllegalArgumentException: Invalid character found in method name [STOMP0x0aaccept-version:1.20x0a0x0a...]. HTTP method names must be tokens
    

    仍在努力让它发挥作用......

    【讨论】:

      【解决方案3】:

      回到原来提到 stomp_dart_client 的帖子,我很难在互联网和 Stack Overflow 上找到工作示例,所以这是我的解决方案,可能会有所帮助。

      我正在使用带有 Web STOMP 插件的 RabbitMQ:https://www.rabbitmq.com/web-stomp.html,将 JSON 数据包发布到名为“ping”的队列中。 stomp_dart_client 的示例和文档不清楚如何连接到安全会话,我已通过在标头中添加身份验证来解决此问题:

      import 'dart:convert';
      
      import 'package:stomp_dart_client/stomp.dart';
      import 'package:stomp_dart_client/stomp_config.dart';
      import 'package:stomp_dart_client/stomp_frame.dart';
      
      dynamic onConnect(StompClient client, StompFrame frame) {
        client.subscribe(
            destination: 'ping',
            callback: (StompFrame frame) {
              var jsonData = json.decode(frame.body);
              print(jsonData);
            });
      }
      
      final stompClient = StompClient(
          config: StompConfig(
              url: 'ws://x.x.x.x:15674/ws',
              onConnect: onConnect,
              onWebSocketError: (dynamic error) => print(error.toString()),
              stompConnectHeaders: {
            'login': 'someuserlogin',
            'passcode': 'somepassword'
          },
      ));
      
      void main() {
        stompClient.activate();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-15
        相关资源
        最近更新 更多