web-dev-qa-db-ja.com

SockjsとSpring 4を使用し、Stompを使用しないWebSocket

WebSocketをSockJSクライアントおよびSpring 4サーバーで使用するが、STOMPを使用しない方法はありますか?

SpringのWebサイトからのこのチュートリアルに基づいて、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);
 };
_

では、Spock 4、SockJS、およびStompなしでこれを行う方法はありますか?または、Spring 4 WebSocketはStompのみをサポートしていますか?

32
BlueChips23

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);
}
52
Sergi Almar