java websocket sockjs spring-4

java - spring websocket



WebSocket con Sockjs y Spring 4 pero sin Stomp (1)

Spring es compatible con STOMP través de WebSocket pero el uso de un subprotocolo no es obligatorio ; puede tratar con el websocket sin procesar. Cuando se utiliza un websocket sin formato, el mensaje envía falta de información para hacer que Spring lo encamine a un método específico de manejo de mensajes (no tenemos ningún protocolo de mensajería), así que en lugar de anotar su controlador, deberá implementar 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); } }

Y luego agregue su controlador al registro en la configuración (puede agregar más de un controlador y usar SockJS para las opciones de 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(); } }

El lado del cliente será algo como esto:

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

¿Hay alguna manera de usar WebSockets con el cliente SockJS y el servidor Spring 4 pero sin usar STOMP?

Basado en este tutorial del sitio web de Spring, sé cómo configurar una aplicación basada en WebSocket usando Stomp y Spring 4. En el lado del cliente, tenemos:

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

Y en el lado del servidor, tenemos lo siguiente en el controlador:

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

Ahora, entiendo que @MessageMapping("/hello") garantiza que si se envía un mensaje a un destino "/hello" , se llamará al método greeting() . Y dado que stompClient está suscrito a "/topic/greetings" , @SendTo("/topic/greetings") enviará el mensaje nuevamente a stompClient .

Pero el problema con lo anterior es que stompClient es un objeto Stomp. Y simplemente quiero usar sock.send(''test''); y enviarlo al destino de mi servidor. Y quiero hacer @SendTo("myownclientdestinationmap") , puedo recibirlo por

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

Entonces, ¿hay alguna manera de hacer esto con Spring 4, SockJS y sin Stomp? ¿O Spring4 WebSocket solo es compatible con Stomp?