SockJS no Spring Boot
No Spring Boot, SockJS
é uma solução de compatibilidade para implementação do WebSocket. Este artigo apresentará SockJS
o princípio, o uso e o código de amostra do .
O que é SockJS
SockJS
É um protocolo de comunicação entre o navegador e o servidor, que pode estabelecer um canal de comunicação bidirecional baseado em HTTP entre o navegador e o servidor. SockJS
A função principal é fornecer uma solução de compatibilidade WebSocket, para que os navegadores que não suportam WebSocket também possam usar WebSocket.
SockJS
Uma camada de compatibilidade WebSocket é implementada, que pode estabelecer um canal de comunicação baseado em HTTP entre o navegador e o servidor e, em seguida, conduzir a comunicação bidirecional por meio desse canal. Quando o navegador não oferece suporte a WebSocket, SockJS
ele alternará automaticamente para polling ou long-polling para comunicação.
Princípio do SockJS
SockJS
O princípio do WebSocket é realizar a comunicação bidirecional do WebSocket estabelecendo um canal de comunicação baseado em HTTP. Quando o navegador oferece suporte a WebSocket, SockJS
ele usará WebSocket diretamente para comunicação; quando o navegador não oferece suporte a WebSocket, SockJS
ele alternará automaticamente para polling ou long-polling para comunicação.
Ao usar SockJS
, primeiro você precisa introduzir sockjs-client.js
e no lado do cliente e no lado do servidor respectivamente sockjs-server
e, em seguida, new SockJS(url)
estabelecer uma SockJS
conexão no lado do cliente por meio de .
A comunicação entre o cliente e o servidor é baseada em eventos, quando o cliente envia uma mensagem, o servidor aciona um onmessage
evento e então envia a mensagem de volta para o cliente. Depois que o cliente receber a mensagem, ele acionará um onmessage
evento e processará a mensagem recebida.
Como usar Sock JS
É muito simples de usar.No SockJS
Spring Boot, você só precisa adicionar o seguinte conteúdo ao arquivo de configuração:
spring:
websocket:
enabled: true
broker:
relay-host: localhost
relay-port: 61613
user: guest
password: guest
relay-path: /stomp
A configuração acima indica que o WebSocket está ativado e as mensagens são enviadas para a porta localhost
de 61613
, guest/guest
o nome de usuário e a senha de são usados para autenticação e /stomp
o caminho de é usado para transmissão de mensagens.
Em seguida, precisamos estabelecer uma conexão no cliente SockJS
e implementar onmessage
o método callback do evento. código mostra como abaixo:
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);
});
});
No código acima, new SockJS('/gs-guide-websocket')
significa usar /gs-guide-websocket
o caminho para estabelecer uma SockJS
conexão. stompClient.connect({}, function(frame){...})
Indica o método de retorno de chamada executado após a conexão ser bem-sucedida e stompClient.subscribe('/topic/greetings', function(greeting){...})
indica o /topic/greetings
destino da assinatura, e o método de retorno de chamada é acionado quando uma mensagem é publicada no destino.
Finalmente, precisamos implementar a função de enviar e receber mensagens no lado do servidor. código mostra como abaixo:
@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();
}
}
No código acima, @EnableWebSocketMessageBroker
a anotação indica que o agente de mensagens WebSocket está ativado, configureMessageBroker
o método é usado para configurar o agente de mensagens e registerStompEndpoints
o método é usado para registrar SockJS
o endpoint.
Em seguida, precisamos implementar as funções de envio e recebimento de mensagens no controlador. código mostra como abaixo:
@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()) + "!");
}
}
No código acima, @MessageMapping("/hello")
a anotação significa processar /hello
a mensagem do destino e @SendTo("/topic/greetings")
a anotação significa enviar o resultado do processamento ao /topic/greetings
destino. greeting
O método implementa a lógica de processamento da mensagem.
Código de amostra
Aqui está um código de exemplo completo, incluindo código de cliente e servidor:
Código do cliente
<!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);
}
código do lado do servidor
@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;
}
}
O código acima implementa uma sala de bate-papo simples. O usuário insere seu nome na caixa de entrada e, em seguida, clica no botão enviar para enviar a mensagem ao servidor. O servidor processa a mensagem recebida e a envia de volta ao cliente. Quando vários usuários usam a sala de bate-papo ao mesmo tempo, cada usuário pode ver as mensagens enviadas por outros usuários.
Resumir
Este artigo apresenta os princípios do Spring Boot SockJS
, incluindoSockJS