当前位置:   article > 正文

springboot+sockjs进行消息推送(广播模式)_sockjs springboot

sockjs springboot

第一步:引入pom依赖:

  1. <!-- sockjs -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-websocket</artifactId>
  5. </dependency>
  6. <!-- 进行页面跳转 -->
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  10. </dependency>

第二步:编写sockjs的springboot配置文件

  1. import org.springframework.context.annotation.Configuration;
  2. import org.springframework.messaging.simp.config.MessageBrokerRegistry;
  3. import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
  4. import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
  5. import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
  6. /**
  7. * 配置WebSocket
  8. */
  9. /**
  10. * 注册端点,发布或者订阅消息的时候需要连接此端点
  11. * setAllowedOrigins 非必须,*表示允许其他域进行连接
  12. * withSockJS 表示开始sockejs支持
  13. */
  14. @Configuration
  15. //注解开启使用STOMP协议来传输基于代理(message broker)的消息,这时控制器支持使用@MessageMapping,就像使用@RequestMapping一样
  16. @EnableWebSocketMessageBroker
  17. public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer{
  18. @Override
  19. //注册STOMP协议的节点(endpoint),并映射指定的url
  20. public void registerStompEndpoints(StompEndpointRegistry registry) {
  21. //注册一个STOMP的endpoint,并指定使用SockJS协议
  22. registry.addEndpoint("/endpoint-websocket").setAllowedOrigins("*").withSockJS();
  23. }
  24. //配置消息代理(Message Broker)
  25. /**
  26. * 配置消息代理(中介)
  27. * enableSimpleBroker 服务端推送给客户端的路径前缀
  28. * setApplicationDestinationPrefixes 客户端发送数据给服务器端的一个前缀
  29. */
  30. @Override
  31. public void configureMessageBroker(MessageBrokerRegistry registry) {
  32. //点对点应配置一个/user消息代理,广播式应配置一个/topic消息代理
  33. registry.enableSimpleBroker("/topic","/user");
  34. //点对点使用的订阅前缀(客户端订阅路径上会体现出来),不设置的话,默认也是/user/
  35. registry.setUserDestinationPrefix("/user");
  36. }
  37. }

 第三步:后台java代码

  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.messaging.handler.annotation.MessageMapping;
  3. import org.springframework.messaging.handler.annotation.SendTo;
  4. import org.springframework.messaging.simp.SimpMessagingTemplate;
  5. import org.springframework.scheduling.annotation.Scheduled;
  6. import org.springframework.stereotype.Controller;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import com.baidu.websocket.model.InMessage;
  9. import com.baidu.websocket.model.OutMessage;
  10. import com.baidu.websocket.model.User;
  11. @Controller
  12. public class GameInfoController {
  13. @RequestMapping("/index")
  14. public String index() {
  15. return "index";
  16. }
  17. @Autowired
  18. private SimpMessagingTemplate template;
  19. //广播推送消息
  20. @Scheduled(fixedRate = 10000)
  21. public void sendTopicMessage() {
  22. System.out.println("后台广播正在推送中...");
  23. User user=new User();
  24. user.setName("qushen");
  25. user.setAge(10);
  26. this.template.convertAndSend("/topic/getResponse",user);
  27. }
  28. }

1.SimpMessagingTemplate:SpringBoot提供操作WebSocket的对象 

2.@Scheduled(fixedRate = 10000):是每十秒执行一次,记得去主类上用@EnableScheduling开启一下定时任务。

3.template.convertAndSend:直接向前端推送消息。

第四步:编写前台代码

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>websocket.html</title>
  5. <meta name="content-type" content="text/html" charset="UTF-8">
  6. </head>
  7. <body>
  8. <div>
  9. <p id="name"></p> <p id="age"></p>
  10. </div>
  11. <!-- 独立JS -->
  12. <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.slim.js"></script>
  13. <script type="text/javascript" src="js/topic.js" charset="utf-8"></script>
  14. <script src="https://cdn.jsdelivr.net/npm/sockjs-client@1/dist/sockjs.min.js"></script>
  15. <script src="https://cdn.bootcss.com/stomp.js/2.3.3/stomp.min.js"></script>
  16. </body>
  17. </html>

第五步:编写 topic.js

  1. var stompClient = null;
  2. //加载完浏览器后 调用connect(),打开双通道
  3. $(function(){
  4. //打开双通道
  5. connect()
  6. })
  7. //强制关闭浏览器 调用websocket.close(),进行正常关闭
  8. window.onunload = function() {
  9. disconnect()
  10. }
  11. function connect(){
  12. var socket = new SockJS('/endpoint-websocket'); //连接SockJS的endpoint名称为"endpointOyzc"
  13. stompClient = Stomp.over(socket);//使用STMOP子协议的WebSocket客户端
  14. stompClient.connect({},function(frame){//连接WebSocket服务端
  15. console.log('Connected:' + frame);
  16. //通过stompClient.subscribe订阅/topic/getResponse 目标(destination)发送的消息
  17. stompClient.subscribe('/topic/getResponse',function(response){
  18. showResponse(JSON.parse(response.body));
  19. });
  20. });
  21. }
  22. //关闭双通道
  23. function disconnect(){
  24. if(stompClient != null) {
  25. stompClient.disconnect();
  26. }
  27. console.log("Disconnected");
  28. }
  29. function showResponse(message){
  30. var response = $("#name");
  31. var response = $("#age");
  32. response.append("<p>"+message.name+"</p>");
  33. response.append("<p>"+message.age+"</p>");
  34. }

最后访问浏览器:http://localhost:8080/index,每十秒便可以得到如下图所示:

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/178651
推荐阅读
相关标签
  

闽ICP备14008679号