Проблемы с автономным подключением клиента Spring Boot + Sockjs

Я пытаюсь подключить сервер Spring Boot Stomp с несколькими клиентами sockjs в автономном режиме, но получаю предупреждение

Websocket закрывается до установления соединения

с последующим

ПОЛУЧИТЬ http://192.168.1.45:8080/socket/327/si5osugt/jsonp?c=jp.a3xdefl net::ERR_ABORTED 404 (не найдено)

Я использую Spring Boot версии 2.1.2 с пакетом spring-boot-starter-websocket на стороне сервера, а на стороне интерфейса я использую Angular 6 с версией sockjs-client 1.3.0. Интерфейс и серверная часть работают на порту 8080.

Я получаю некоторые ошибки при отключении интернета. Если интернет отключен, iframe пытается подключиться к https://cdn.jsdelivr.net/npm/sockjs-client@1/dist/sockjs.js.

Мне удалось настроить сервер stomp на серверной части для установки клиентской библиотеки, добавив .setClientLibraryUrl к абсолютному пути, который доступен в автономном режиме.

registry.addEndpoint("/socket").setAllowedOrigins("*").withSockJS).setClientLibraryUrl("http://192.168.1.45/dist/sockjs.min.js");

и получите 200 OK на http://192.168.1.45/dist/sockjs.min.js< /а>

Весенний ботинок:

WebSocketConfiguration (расширяет AbstractWebSocketMessageBrokerConfigurer)

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/socket")
            .setAllowedOrigins("*")
            .withSockJS().setClientLibraryUrl("http://192.168.1.45/dist/sockjs.min.js");
}

@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
    MessageBrokerRegistry messageBrokerRegistry = registry.setApplicationDestinationPrefixes("/app");
    messageBrokerRegistry.enableSimpleBroker( "/test", "/test2"
    );
}

Веб-сокетконтроллер

private final SimpMessagingTemplate template;

@Autowired
WebSocketController(SimpMessagingTemplate template){
    this.template=template;
}

@MessageMapping("/send/message")
public void onReceivedMessage( String destination , String message){
    this.template.convertAndSend(destination , message);
}

public void convertAndSend(String url, Object o){
    this.template.convertAndSend(url, o);
}

Угловой 6:

ТестКомпонет

ngAfterViewInit() {
  let ws = new SockJS('http://192.168.1.45:8080/socket');
  this.stompClient = Stomp.over(ws);
  let that = this;
  that.stompClient.subscribe("/test", (message) => {
    if (message.body) {
     console.log(message.body);
    }
  });
  that.stompClient.subscribe("/test2", (message) => {
    if (message.body) {
     console.log(message.body);
    }
  });
}

Я думал, что это сработает, просто добавив клиентскую библиотеку sockjs в автономный доступный путь, но я получаю предупреждение

Websocket закрывается до установления соединения

с последующим

"GET http://192.168.1.45:8080/socket/327/si5osugt/jsonp?c=jp.a3xdefl net::ERR_ABORTED 404 (не найдено)"

Библиотека отлично работает с подключением к Интернету, но мне нужно, чтобы она работала как в онлайн, так и в офлайн-режиме.


person rt-kestermann    schedule 12.02.2019    source источник


Ответы (1)


У меня была такая же проблема, и я исправил ее, удалив SockJs. Так что теперь я использую только Stomp-Websockets.

Изменения в SpringBoot-Service(WebsocketConfiguration):

registry.addEndpoint("/justStomp").setAllowedOrigins("*");

Я удалил .withSockJS() и .setClientLibraryUrl(../sockjs.min.js)

Изменения в моем Javascript-коде для подключения к веб-сокету:

  const stompClient = Stomp.client(`ws://localhost:8080/justStomp`);
  stompClient.heartbeat.outgoing = 0;
  stompClient.heartbeat.incoming = 0;
  stompClient.connect({ name: 'test' }, frame => this.stompSuccessCallBack(frame, stompClient), err => this.stompFailureCallBack(err));

Вместо использования Stomp.over(sockjs) я использую метод Stomp.client для прямого подключения к URL-адресу websocket. У меня есть rabbitMQ в фоновом режиме с плагином stomp, и он работает правильно только с двумя настройками сердцебиения. см. здесь RabbitMQ Web STOMP без SockJS

person metalhead666    schedule 17.09.2019