0


使用WebSocket实现从后端向前端推送信息

本文做一个简单的应用,使用单例模式+WebSocket向前端提示需要处理的消息数量。

“+”和“-”表示用户端做的操作;“查看消息[8]”表示管理端需要处理的消息。

引入依赖

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.4.2</version>
  5. <relativePath/>
  6. </parent>
  7. <dependencies>
  8. <dependency>
  9. <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-starter-web</artifactId>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-starter-websocket</artifactId>
  15. </dependency>
  16. <dependencies>

注入ServerEndpointExporter,这个Bean会自动注册使用了@ServerPoint注解声明的类。

  1. @Configuration
  2. public class WebSocketConfig {
  3. @Bean
  4. public ServerEndpointExporter serverEndpointExporter() {
  5. return new ServerEndpointExporter();
  6. }
  7. }

创建数量单例,这里的单例是本文主要向前端推送的内容。

由于此单例需要频繁使用,所以创建为饿汉式单例。

  1. public class CountSingle {
  2. private Integer count = 10;
  3. private final static CountSingle countSingle = new CountSingle();
  4. public static Integer getCount() {
  5. return getInstance().count;
  6. }
  7. public static synchronized void setCount(OperEnum operEnum) {
  8. if (operEnum == OperEnum.ADD) {
  9. getInstance().count++;
  10. }
  11. if (operEnum == OperEnum.SUB) {
  12. getInstance().count--;
  13. }
  14. }
  15. public static CountSingle getInstance() {
  16. return countSingle;
  17. }
  18. }

创建操作枚举,规范代码。

  1. public enum OperEnum {
  2. ADD(1), SUB(2);
  3. private final Integer code;
  4. OperEnum(int code) {
  5. this.code = code;
  6. }
  7. public Integer getCode() {
  8. return code;
  9. }
  10. }

WebSocket服务类创建。

  1. @Component
  2. @ServerEndpoint("/websocket")
  3. public class WebSocketServer {
  4. private static final CopyOnWriteArraySet<WebSocketServer> connections = new CopyOnWriteArraySet<>();
  5. private Session session;
  6. @OnOpen
  7. public void onOpen(Session session) {
  8. this.session = session;
  9. connections.add(this);
  10. this.sendMessage(String.valueOf(CountSingle.getCount()));
  11. System.out.println("新建连接: " + session.getId());
  12. }
  13. @OnClose
  14. public void onClose() {
  15. connections.remove(this);
  16. System.out.println("连接关闭: " + session.getId());
  17. }
  18. @OnError
  19. public void onError(Throwable error) {
  20. error.printStackTrace();
  21. }
  22. private void sendMessage(String message) {
  23. try {
  24. this.session.getBasicRemote().sendText(message);
  25. } catch (IOException e) {
  26. e.printStackTrace();
  27. }
  28. }
  29. public static void broadcast(String message) {
  30. for (WebSocketServer client : connections) {
  31. client.sendMessage(message);
  32. }
  33. }
  34. }

创建控制器,对于CountSingle的count数量加减的操作。

  1. @RestController
  2. public class CountController {
  3. @GetMapping("add")
  4. public void add() {
  5. CountSingle.setCount(OperEnum.ADD);
  6. WebSocketServer.broadcast(String.valueOf(CountSingle.getCount()));
  7. }
  8. @GetMapping("sub")
  9. public void sub() {
  10. CountSingle.setCount(OperEnum.SUB);
  11. WebSocketServer.broadcast(String.valueOf(CountSingle.getCount()));
  12. }
  13. }

前端功能编写。使用jQuery的Ajax发送请求(或给查看信息后面的徽章赋值)、Layui的徽章组件编写主要样式。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Document</title>
  7. <script src="/lib/jquery-3.4.1.min.js"></script>
  8. <script src="/lib/layui-v2.5.5/layui.js"></script>
  9. <link rel="stylesheet" href="/lib/layui-v2.5.5/css/layui.css">
  10. <style>
  11. div {
  12. text-align: center;
  13. }
  14. </style>
  15. </head>
  16. <body>
  17. <div>
  18. <button class="layui-btn layui-btn-sm layui-btn-normal" onclick="add()">+</button>
  19. <button class="layui-btn layui-btn-sm layui-btn-warm" onclick="sub()">-</button>
  20. <button class="layui-btn">查看消息<span class="layui-badge layui-bg-gray" id="count"></span></button>
  21. </div>
  1. let socket = new WebSocket("ws://localhost:8080/websocket");
  2. socket.onmessage = function (event) {
  3. $("#count").text(event.data);
  4. };
  5. function add() {
  6. $.ajax({
  7. url: '/add', // 请求的 URL
  8. type: 'GET', // 请求方法:GET、POST 等
  9. dataType: 'json', // 预期服务器返回的数据类型
  10. });
  11. }
  12. function sub() {
  13. $.ajax({
  14. url: '/sub', // 请求的 URL
  15. type: 'GET', // 请求方法:GET、POST 等
  16. dataType: 'json', // 预期服务器返回的数据类型
  17. });
  18. }

最后实现的效果。这里需要使用两个浏览器才能看到效果。

首先打开Edge浏览器(初始)。这里为了更好的看到效果,加上了一个显示时间的组件。

点击加号按钮。

打开Chrome浏览器查看到消息成功推送。

最后附上gitee地址:WebsocketTest: 本系统做一个简单的应用,使用单例模式+WebSocket向前端提示需要处理的消息数量。


本文转载自: https://blog.csdn.net/triumph55/article/details/140076529
版权归原作者 triumph qy 所有, 如有侵权,请联系我们删除。

“使用WebSocket实现从后端向前端推送信息”的评论:

还没有评论