Spring Boot の SockJS
Spring Boot には、SockJS
WebSocket を実装するための互換性ソリューションがあります。SockJS
この記事では、 の原理、使い方、サンプルコードを紹介します。
SockJSとは何ですか
SockJS
これはブラウザとサーバー間の通信プロトコルであり、ブラウザとサーバーの間に HTTP に基づいた双方向通信チャネルを確立できます。SockJS
主な役割は、WebSocket をサポートしていないブラウザでも WebSocket を使用できるように、WebSocket 互換性ソリューションを提供することです。
SockJS
WebSocket 互換性レイヤーが実装されており、ブラウザーとサーバーの間に HTTP ベースの通信チャネルを確立し、このチャネルを通じて双方向通信を行うことができます。ブラウザがWebSocketをサポートしていない場合は、SockJS
自動的にポーリングまたはロングポーリングに切り替わって通信します。
SockJS の原理
SockJS
WebSocketの原理は、HTTPベースの通信チャネルを確立することでWebSocketの双方向通信を実現することです。ブラウザが WebSocket をサポートしている場合は、SockJS
WebSocket を直接使用して通信しますが、ブラウザが WebSocket をサポートしていない場合は、SockJS
自動的にポーリングまたはロングポーリングに切り替えて通信します。
を使用する場合は、まずクライアント側とサーバー側にそれぞれと を導入し、次にクライアント側で を介して接続を確立するSockJS
必要があります。sockjs-client.js
sockjs-server
new SockJS(url)
SockJS
クライアントとサーバー間の通信はイベントベースであり、クライアントがメッセージを送信すると、サーバーはイベントをトリガーしてonmessage
、メッセージをクライアントに送り返します。クライアントはメッセージを受信すると、onmessage
イベントをトリガーし、受信したメッセージを処理します。
SockJSの使い方
使い方は非常に簡単SockJS
で、Spring Boot では次の内容を構成ファイルに追加するだけです。
spring:
websocket:
enabled: true
broker:
relay-host: localhost
relay-port: 61613
user: guest
password: guest
relay-path: /stomp
localhost
上記の設定は、WebSocket が有効であり、メッセージがのポートに送信され61613
、guest/guest
のユーザー名とパスワードが認証に使用され、/stomp
のパスがメッセージ送信に使用されることを示しています。
次に、クライアントで接続を確立しSockJS
、onmessage
イベントのコールバック メソッドを実装する必要があります。コードは以下のように表示されます:
var socket = new SockJS('/gs-guide-websocket');
stompClient = Stomp.over(socket);
stompClient.connect({
}, function(frame) {
stompClient.subscribe('/topic/greetings', function(greeting){
showGreeting(JSON.parse(greeting.body).content);
});
});
上記のコードでは、パスnew SockJS('/gs-guide-websocket')
を使用して接続を確立することを意味します。接続が成功した後に実行されるコールバック メソッドを示し、サブスクリプションの宛先を示します。コールバック メソッドは、メッセージが宛先にパブリッシュされるときにトリガーされます。/gs-guide-websocket
SockJS
stompClient.connect({}, function(frame){...})
stompClient.subscribe('/topic/greetings', function(greeting){...})
/topic/greetings
最後に、サーバー側でメッセージを送受信する機能を実装する必要があります。コードは以下のように表示されます:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableStompBrokerRelay("/topic")
.setRelayHost("localhost")
.setRelayPort(61613)
.setClientLogin("guest")
.setClientPasscode("guest")
.setSystemHeartbeatSendInterval(5000)
.setSystemHeartbeatReceiveInterval(4000);
registry.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/gs-guide-websocket").withSockJS();
}
}
上記のコードでは、@EnableWebSocketMessageBroker
注釈は WebSocket メッセージ ブローカーが有効であること、configureMessageBroker
メソッドがメッセージ ブローカーの構成に使用されること、registerStompEndpoints
メソッドがSockJS
エンドポイントの登録に使用されることを示しています。
次に、コントローラーにメッセージの送受信機能を実装する必要があります。コードは以下のように表示されます:
@Controller
public class GreetingController {
@MessageMapping("/hello")
@SendTo("/topic/greetings")
public Greeting greeting(HelloMessage message) throws Exception {
Thread.sleep(1000); // simulated delay
return new Greeting("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!");
}
}
上記のコードにおいて、@MessageMapping("/hello")
アノテーションは/hello
宛先のメッセージを処理することを意味し、@SendTo("/topic/greetings")
アノテーションは処理結果を/topic/greetings
宛先に送信することを意味します。greeting
このメソッドはメッセージの処理ロジックを実装します。
サンプルコード
以下は、クライアント コードとサーバー コードを含む完全なサンプル コードです。
クライアントコード
<!DOCTYPE html>
<html>
<head>
<title>Hello WebSocket</title>
<script src="/webjars/sockjs-client/1.1.2/dist/sockjs.min.js"></script>
<script src="/webjars/stomp-websocket/2.3.3/dist/stomp.min.js"></script>
<script src="/js/app.js"></script>
</head>
<body>
<div>
<label>What is your name?</label>
<input type="text" id="name" />
<button type="button" onclick="send()">Send</button>
</div>
<div id="greetings">
</div>
</body>
</html>
var socket = new SockJS('/gs-guide-websocket');
stompClient = Stomp.over(socket);
stompClient.connect({
}, function(frame) {
stompClient.subscribe('/topic/greetings', function(greeting){
showGreeting(JSON.parse(greeting.body).content);
});
});
function send() {
var name = document.getElementById('name').value;
stompClient.send("/app/hello", {
}, JSON.stringify({
'name': name }));
}
function showGreeting(message) {
var div = document.createElement('div');
div.appendChild(document.createTextNode(message));
document.getElementById('greetings').appendChild(div);
}
サーバー側のコード
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableStompBrokerRelay("/topic")
.setRelayHost("localhost")
.setRelayPort(61613)
.setClientLogin("guest")
.setClientPasscode("guest")
.setSystemHeartbeatSendInterval(5000)
.setSystemHeartbeatReceiveInterval(4000);
registry.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/gs-guide-websocket").withSockJS();
}
}
@Controller
public class GreetingController {
@MessageMapping("/hello")
@SendTo("/topic/greetings")
public Greeting greeting(HelloMessage message) throws Exception {
Thread.sleep(1000); // simulated delay
return new Greeting("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!");
}
}
public class HelloMessage {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Greeting {
private String content;
public Greeting(String content) {
this.content = content;
}
public String getContent() {
return content;
}
}
上記のコードは、単純なチャット ルームを実装します。ユーザーは入力ボックスに自分の名前を入力し、送信ボタンをクリックしてメッセージをサーバーに送信します。サーバーは受信したメッセージを処理し、クライアントに送り返します。受信したニュース。複数のユーザーが同時にチャット ルームを使用すると、各ユーザーは他のユーザーが送信したメッセージを見ることができます。
要約する
この記事では、 Spring Boot の原則を紹介しますSockJS
。SockJS