WebSocket con Sockjs e Spring 4 ma senza Stomp

C’è un modo per utilizzare WebSockets con il client SockJS e il server Spring 4 ma non utilizzando STOMP?

Sulla base di questo tutorial tratto dal sito web di Spring, so come impostare un’applicazione basata su WebSocket usando Stomp e Spring 4. Sul lato client, abbiamo:

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); }); }); 

E sul lato server, abbiamo il seguente nel controller:

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

Ora capisco che @MessageMapping("/hello") assicura che se un messaggio viene inviato a una destinazione "/hello" , verrà chiamato il metodo greeting() . E poiché lo stompClient è sottoscritto a "/topic/greetings" , @SendTo("/topic/greetings") invierà il messaggio allo stompClient .

Ma il problema con quanto sopra è che stompClient è un object Stomp. E voglio semplicemente usare sock.send('test'); e averlo consegnato alla destinazione del mio server. E voglio fare @SendTo("myownclientdestinationmap") , posso riceverlo da

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

Quindi, un modo per farlo con Spring 4, SockJS e senza Stomp? Oppure Spring 4 WebSocket supporta solo Stomp?

Spring supporta STOMP su WebSocket ma l’uso di un subprotocollo non è obbligatorio , puoi gestire il websocket raw. Quando si utilizza un websocket raw, il messaggio ha inviato scarse informazioni per fare in modo che Spring lo indirizzi a uno specifico metodo di gestione dei messaggi (non abbiamo alcun protocollo di messaggistica), quindi invece di annotare il controller, è necessario implementare un 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); } } 

E poi aggiungi il gestore al registro nella configurazione (puoi aggiungere più di un gestore e usare SockJS per le opzioni di fallback):

 @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(); } } 

Il lato client sarà qualcosa del genere:

 var sock = new SockJS('http://localhost:8080/greeting'); sock.onmessage = function(e) { console.log('message', e.data); }