Возникли проблемы при отправке данных на мой веб-сокет, созданный в Spring-Boot от Flutter - PullRequest
0 голосов
/ 21 февраля 2020

Я пытаюсь отправить данные через IOWebSocketChannel в Flutter.io на WebSocket, созданный в Spring-Boot.

В весенней загрузке я создал типичную конфигурацию WebSocket и контроллеры, которые имеют дело с манипуляциями клиента с мои серверы WebSocket. Я опубликую их ниже только для справки.

WebSocketConfiguration. java

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer{

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry){
        registry.addEndpoint("/websocket")
        .setAllowedOrigins("*")     // allow us to connect to ws://localhost:8080/websocket with the default Spring port configuration.
        .withSockJS();   // allows a client which does not support WebSocket natively mimic a WebSocket over an HTTP connection
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry){  //The configureMessageBroker method sets up a simple (in-memory) message broker for our application
       registry.enableSimpleBroker("/topic");                   //topic to be routed back to client
       registry.setApplicationDestinationPrefixes("/app");      //This configuration allows Spring to understand that any message sent to a WebSocket channel name prefixed with /app should be routed to a @MessageMapping in our application.
    }
}

WebSocketController. java

@Controller
public class WebSocketController {
    private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketController.class);

    @MessageMapping("/send")
    @SendTo("/topic/messages")
    public Message send(Message message) {
        LOGGER.info(String.format("Received message [%s]", message.toString()));
        LocalDateTime timestamp = LocalDateTime.now();
        return new Message(message.getFrom(), message.getMessage(), timestamp);
    }

}

Теперь, когда я пытаюсь использовать IOWebSocketChannel, я выполняю типичный протокол подключения к моей настроенной веб-розетке. Ниже приведен код

final channel = IOWebSocketChannel.connect(
      "ws://10.0.2.2:8080/websocket"
);

Затем я создал метод, который должен отправлять данные в мой веб-сокет, поэтому я пытаюсь подключиться к той конечной точке, которая, как вы видите, создается в WebSocketController. java с именем app/send/. Ниже приведен код:

void _sendMessage() {
    IOWebSocketChannel channel = IOWebSocketChannel.connect('ws://10.0.2.2:8080/app/send');
    channel.sink.add(
      json.encode({
        "message": "bars",
      })
    );
  }

Теперь, когда я проверяю свой сервер Spring-Boot, ничего не регистрируется, однако, всякий раз, когда я выполняю горячую перезагрузку в Flutter Spring Boot и время моего подключения к веб-сокету истекает, сервер tomcat возвращает это : Tomcat server informing on websocket connection

Итак, мой вопрос: удалось ли кому-нибудь сделать прорыв, отправив данные через веб-сокеты из Flutter в Spring-Boot с помощью IOWebSocketChannel? Мне также интересно, нашел ли кто-нибудь способ успешно использовать протокол STOMP во Flutter.io? Я использовал stomp_client , так как казалось, что он добьется цели, хотя и правильно, если я ошибаюсь, но флаттер сообщал мне об ошибках, говоря, что файлов html не существует, поэтому Я предполагаю, что библиотека предназначена только для дротиков в сети.

1 Ответ

0 голосов
/ 28 марта 2020

Ваша конфигурация Spring выглядит хорошо. Но на стороне клиента вам нужны некоторые настройки.

Я потратил некоторое время, чтобы выяснить это с пакетом https://pub.dev/packages/stomp. Используйте модифицированную версию функции подключения, предоставленную здесь . Обязательно используйте эту пользовательскую реализацию функции connect.

Future<StompClient> client = customStomp.connect('ws://10.0.2.2:8080/websocket', ...)

После подключения в соответствии с вашей конфигурацией вы можете отправить сообщение по следующему адресу: /app/send.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...