websocket暂时能想到的应用是浏览器聊天和后台日志实时显示到前台。
当后台启动程序后,等待前台连接,连接上之后,前后台就可以相互发送数据了。
先贴上pom配置:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>webjars-locator</artifactId>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>sockjs-client</artifactId>
<version>1.0.2</version>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>stomp-websocket</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.1.0</version>
</dependency>
websocket配置类
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");//配置客户端订阅前缀
config.setApplicationDestinationPrefixes("/app");//配置客户端发送消息路径前缀
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
//"/gs-guide-websocket"是前台连接的端点url
registry.addEndpoint("/gs-guide-websocket").withSockJS();
}
}
java服务器端推送用例
@Component
public class WebSocketTemplate {
private SimpMessagingTemplate messagingTemplate;
@Autowired
public WebSocketTemplate(SimpMessagingTemplate messagingTemplate) {
this.messagingTemplate = messagingTemplate;
}
//向订阅了 /topic/hello 客户端websocket实例发送数据
public void sendMessage(String message){
messagingTemplate.convertAndSend("/topic/hello","hello,client");
}
}
服务器端接收客户端发送的消息并反馈
@Controller
public class GreetingController {
@MessageMapping("/hello")
@SendTo("/topic/hello")
public String greeting(String message) throws Exception {
Thread.sleep(1000); // simulated delay
return "Hello, client! I get your message";
}
}
客户端需要的
<script src="/webjars/jquery/jquery.min.js"></script>
<script src="/webjars/sockjs-client/sockjs.min.js"></script>
<script src="/webjars/stomp-websocket/stomp.min.js"></script>
var stompClient = null;
//连接到服务器
function connect() {
var socket = new SockJS('/gs-guide-websocket');
stompClient = Stomp.over(socket);
stompClient.connect({}, function (frame) {
console.log('Connected: ' + frame);
//接收服务端发送给/topic/greetings的订阅消息
stompClient.subscribe('/topic/greetings', function (greeting) {
console.log(greeting);
JSON.parse(greeting.body);//解析json字符串为对象
});
});
//断开连接
function disconnect() {
if (stompClient !== null) {
stompClient.disconnect();
}
//向服务器发送消息
function sendHello() {
stompClient.send("/app/hello", {}, "hello server");
}
}
}
存在的问题:
客户端刷新后没有断开连接的话,服务器再次发送数据给客户端会接收到两次消息。
如果有了解的,希望指教一下。