WebSocket с Sockjs и Spring 4, но без Stomp

Есть ли способ использовать WebSockets с клиентом SockJS и сервером Spring 4, но без использования STOMP?

Основываясь на этом руководстве с веб-сайта Spring, я знаю, как настроить приложение на основе WebSocket с помощью Stomp и Spring 4. На стороне клиента у нас есть:

     var socket = new SockJS('/hello');
        stompClient = Stomp.over(socket);
        stompClient.connect({}, function(frame) {
            setConnected(true);
            console.log('Connected: ' + frame);
            stompClient.subscribe('/topic/greetings', function(greeting){
                showGreeting(JSON.parse(greeting.body).content);
            });
        });

А на стороне сервера у нас в контроллере следующее:

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

Теперь я понимаю, что @MessageMapping("/hello") гарантирует, что если сообщение будет отправлено адресату "/hello", тогда будет вызван метод greeting(). И поскольку stompClient подписан на "/topic/greetings", @SendTo("/topic/greetings") отправит сообщение обратно stompClient.

Но проблема с вышеизложенным состоит в том, чтоОМОМPClient является объект Stomp. И я хочу просто использовать sock.send('test'); и доставить его к месту назначения моего сервера. И я хочу сделать @SendTo("myownclientdestinationmap"), я могу получить его по

sock.onmessage = function(e) {
     console.log('message', e.data);
 };

Итак, как это сделать с помощью Spring 4, SockJS и без Stomp? Или Spring 4 WebSocket поддерживает только Stomp?


person BlueChips23    schedule 26.11.2014    source источник
comment
Я хочу использовать WebSocket в моем spring-mvc приложении, не могли бы вы подсказать / рассказать мне, почему вы не хотите использовать STOMP?, Спасибо !!!   -  person Shantaram Tupe    schedule 24.11.2017


Ответы (1)


Spring поддерживает STOMP более WebSocket, но использование подпротокола не обязательно, вы можете иметь дело с необработанным веб-сокетом. При использовании необработанного веб-сокета отправленное сообщение не содержит информации, чтобы Spring перенаправил его к определенному методу обработчика сообщений (у нас нет протокола обмена сообщениями), поэтому вместо аннотирования вашего контроллера вам придется реализовать WebSocketHandler:

public class GreetingHandler extends TextWebSocketHandler {

    @Override
    public void handleTextMessage(WebSocketSession session, TextMessage message) {
        Thread.sleep(3000); // simulated delay
        TextMessage msg = new TextMessage("Hello, " + message.getPayload() + "!");
        session.sendMessage(msg);
    }
}

А затем добавьте свой обработчик в реестр в конфигурации (вы можете добавить более одного обработчика и использовать SockJS для резервных вариантов):

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(greetingHandler(), "/greeting").withSockJS();
    }

    @Bean
    public WebSocketHandler greetingHandler() {
        return new GreetingHandler();
    }
}

Клиентская сторона будет примерно такой:

var sock = new SockJS('http://localhost:8080/greeting');

sock.onmessage = function(e) {
    console.log('message', e.data);
}
person Sergi Almar    schedule 27.11.2014
comment
Это именно то, что я искал. Спасибо! - person BlueChips23; 27.11.2014
comment
привет @Sergi Almar, у меня есть один вопрос: можно ли подключиться к веб-сокету с помощью Spring 4, используя new WebSocket('ws://localhost:8080/my-app/ws-connect-url');? - person Dev; 27.05.2015
comment
Конечно, просто удалите .withSockJS (); из конфигурации и используйте простой JS WebSocket API (у вас не будет альтернативных вариантов) - person Sergi Almar; 27.05.2015
comment
Этот ответ отлично работает, но теперь мне интересно: возможно ли в этой настройке транслировать сообщение всем подключенным клиентам? Это просто в простых веб-сокетах JSR356, поэтому я надеюсь, что и здесь это выполнимо. - person TMG; 25.11.2015
comment
Создал отдельный вопрос из моего последнего комментария: stackoverflow.com/q/33910639/4358405 - person TMG; 25.11.2015
comment
Я не могу использовать его без .withSockJS () - ›не могу подключиться с помощью ws: // localhost ...., не могли бы вы помочь? Я использую весенний ботинок - person Greyshack; 13.12.2015
comment
Клиент Websocket не работает с Spring boot 1.3.2 с аутентификацией. stackoverflow.com/questions/35332080/ - person myspri; 11.02.2016
comment
@SergiAlmar не могли бы вы помочь мне с Как правильно настроить конечную точку Stomp и SockJS в Spring MVC? - person Shantaram Tupe; 29.11.2017