有没有办法将WebSockets与SockJS客户端和Spring 4服务器一起使用,但不使用STOMP?
基于Spring网站上的本教程,我知道如何使用Stomp和Spring 4设置基于WebSocket的应用程序。在客户端,我们有:
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
。
但上述问题是 stompClient 是一个 Stomp 对象。我想简单地使用sock.send('test');
并将其传送到服务器的目的地。我想做@SendTo("myownclientdestinationmap")
,我可以通过以下方式接收
sock.onmessage = function(e) {
console.log('message', e.data);
};
那么,有什么方法可以用Spring 4,SockJS和没有Stomp来做到这一点吗?还是Spring 4 WebSocket只支持Stomp?
Spring 支持STOMP
超过 WebSocket
但使用子协议不是强制性的,你可以处理原始 websocket。使用原始 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);
}