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?