springboot+websocket 后台主动向前端推送消息

青旅半醒 2021-09-23 12:00 647阅读 0赞

最近做项目,用到后台需要实时向前台推送消息,看了很多例子,终于实现

idea工具,创建maven项目(这里就不多说了,可以直接用骨架搭建)

首先创建 WebSocketConfig 搭建websocket服务器

  1. @Configuration
  2. @EnableWebSocketMessageBroker
  3. public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
  4. //消息主动推送
  5. @Override
  6. public void registerStompEndpoints(StompEndpointRegistry registry) {
  7. registry.addEndpoint("/socket").withSockJS();
  8. }
  9. //消息主动推送给指定用户
  10. @Override
  11. public void configureMessageBroker(MessageBrokerRegistry registry) {
  12. registry.enableSimpleBroker("/server","/user");
  13. }
  14. }

前端index.html页面,需要引入三个jar报,可以在https://www.bootcdn.cn/下载

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="jquery.js"></script>
  7. <script src="sockjs.js"></script>
  8. <script src="stomp.js"></script>
  9. </head>
  10. <body>
  11. <div id="msg"></div>
  12. <script>
  13. var sockJS=new SockJS("http://localhost:8080/socket");
  14. var stompClient=Stomp.over(sockJS);
  15. stompClient.connect({},function(data){
  16. //订阅
  17. stompClient.subscribe("/server/sendMessageByServer",function (response) {
  18. $("#msg").append(response.body+"<br/>");
  19. })
  20. })
  21. </script>
  22. </body>
  23. </html>

推送指定user.html用户页面

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="jquery.js"></script>
  7. <script src="sockjs.js"></script>
  8. <script src="stomp.js"></script>
  9. </head>
  10. <body>
  11. ${id}
  12. <div id="msg"></div>
  13. <script>
  14. var id='${id}';
  15. var sockJS=new SockJS("http://localhost:8080/socket");
  16. var stompClient=Stomp.over(sockJS);
  17. stompClient.connect({},function(data){
  18. //订阅
  19. stompClient.subscribe("/user/"+id+"/server/sendMessageByServer",function (response) {
  20. $("#msg").append(response.body+"<br/>");
  21. })
  22. })
  23. </script>
  24. </body>
  25. </html>

controller实体类

  1. @Controller
  2. @RequestMapping
  3. public class IndexController {
  4. @GetMapping("/")
  5. public String index(){
  6. return "index";
  7. }
  8. //发送指定用户
  9. @GetMapping("/user")
  10. public String user(Long id, ModelMap model){
  11. model.addAttribute("id",id);
  12. return "user";
  13. }
  14. }
  15. MyJob
  16. @Configuration
  17. public class MyJob {
  18. @Autowired
  19. private SimpMessagingTemplate simpMessagingTemplate;
  20. @Scheduled(fixedRate = 1000)
  21. public void sendMessage(){
  22. System.out.println("来自服务端的消息");
  23. simpMessagingTemplate.convertAndSend("/server/sendMessageByServer",System.currentTimeMillis());
  24. }
  25. @Scheduled(fixedRate = 10000)
  26. public void sendMessageToUser(){
  27. System.out.println("来自服务端的消息,推送给指定用户");
  28. simpMessagingTemplate.convertAndSendToUser("1","/server/sendMessageByServer",System.currentTimeMillis());
  29. }
  30. }

以上是全部代码:

运行springboot启动方法,启动成功后,浏览器访问

http://localhost:8080/ 返回的是每隔1秒获取到的毫秒数

http://localhost:8080/user?id=1 返回的是每隔10秒获取到的毫秒数

这里的id与MyJob类中

simpMessagingTemplate.convertAndSendToUser(“1”,”/server/sendMessageByServer”,System.currentTimeMillis());

的“1”对应,代表id为1的用户

大家可以灵活运用

simpMessagingTemplate.convertAndSend(“/server/sendMessageByServer”,System.currentTimeMillis());

或者

simpMessagingTemplate.convertAndSendToUser(“1”,”/server/sendMessageByServer”,System.currentTimeMillis());

可以放到大家需要推送的方法中

链接:https://pan.baidu.com/s/1p8Etfh3KH6jBrAmfhb-x9Q
提取码:kz8a

发表评论

表情:
评论列表 (有 0 条评论,647人围观)

还没有评论,来说两句吧...

相关阅读