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