Spring Boot Websocket服务器的Flutter客户端订阅

问题描述

下面是我的Spring Boot代码,用于安排向其连接的客户端发送消息的时间。 但是我的FlutteR应用程序无法从websocket服务器接收推送的消息。

@Service
public class GreetingService {

    private final SimpMessagingTemplate simpMessagingTemplate;
    private static final String WS_MESSAGE_TRANSFER_DESTINATION = "/topic/greetings";
    private List<String> userNames = new ArrayList<>();

    GreetingService(SimpMessagingTemplate simpMessagingTemplate) {
        this.simpMessagingTemplate = simpMessagingTemplate;
    }

    public void sendMessages() {
        for (String userName : userNames) {
            simpMessagingTemplate.convertAndSendToUser(userName,WS_MESSAGE_TRANSFER_DESTINATION,"Hallo " + userName + " at " + new Date().toString());
        }
    }

    public void addUserName(String username) {
        userNames.add(username);
    }
    
}

Flutter代码:-

var channel = IOWebSocketChannel.connect("ws://1f470ad1bdc8.ngrok.io/ws");
    channel.stream.listen((message) {
      channel.sink.add("received!");
    });

解决方法

您必须创建一个 Spring Configuration 类来初始化订阅路径。

@Configuration
@EnableWebSocketMessageBroker
public class WSocketBrokerConfiguration implements WebSocketMessageBrokerConfigurer {

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

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/socket")
                .setAllowedOrigins("*");
    }

}