Springboot整合Websocket实现后端向前端主动推送消息案例

架构 2023-07-05 17:29:38
489阅读

在手机上坚信都是有来源于网络服务器的消息推送信息,例如一些立即的新闻报道,本文关键便是完成这一作用,只演试一个基本上的实例。应用的是websocket技术性。

一、什么叫websocke

tWebSocket协议书是根据TCP的一种新的网络层协议。它完成了手机客户端与网络服务器双工通讯,学过计算机网都了解,即然是双工,就表明了网络服务器能够积极发送短信给手机客户端。这与大家的消息推送技术性或是是多的人即时聊天的作用如出一辙。

为什么不应用HTTP 协议书呢?这是由于HTTP是单工通讯,通讯只有由手机客户端进行,手机客户端要求一下,网络服务器解决一下,这就太麻烦了。因此websocket应时而生。

下边大家就立即逐渐应用Springboot逐渐融合。下列实例都是在自己的电脑检测取得成功,你能依据自身的作用开展改动就可以。

二、融合websocket

1、自然环境配备

Idea 2018标准版(已破解)

Maven 4.0.0

SpringBoot 2.2.2

websocket 2.1.3

jdk 1.8

下边大家新创建一个一般的Springboot新项目。

2、加上依靠

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

3、在application.properties文件改动服务器端口

一句话:server.port=8081

4、新创建config包,建立WebSocketConfig类

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

5、新创建service包,建立WebSocketServer类

 
  1. @ServerEndpoint("/websocket/{sid}"
  2. @Component 
  3. public class WebSocketServer { 
  4.     static Log log= LogFactory.getLog(WebSocketServer.class); 
  5.     //静态变量,用于纪录当今在线线程数。应当把它设计方案成线程安全的。 
  6.     private static int onlineCount = 0; 
  7.     //concurrent包的线程安全Set,用于储放每一个手机客户端相匹配的MyWebSocket目标。 
  8.     private static CopyOnWriteArraySet<WebSocketServer> webSocketSet 
  9.             = new CopyOnWriteArraySet<WebSocketServer>(); 
  10.     //与某一手机客户端的联接对话,必须根据它来给手机客户端传送数据 
  11.     private Session session; 
  12.     //接受sid 
  13.     private String sid=""
  14.     /** 
  15.      * 联接创建取得成功启用的方式  
  16.      */ 
  17.     @OnOpen 
  18.     public void onOpen(Session session,@PathParam("sid") String sid) { 
  19.         this.session = session; 
  20.         webSocketSet.add(this);     //添加set中 
  21.         addOnlineCount();           //线上数加1 
  22.         log.info("有新页面逐渐监视:" sid ",当前在线总数为"   getOnlineCount()); 
  23.         this.sid=sid; 
  24.         try { 
  25.             sendMessage("联接取得成功"); 
  26.         } catch (IOException e) { 
  27.             log.error("websocket IO出现异常"); 
  28.         } 
  29.     } 
  30.     /** 
  31.      * 联接关掉启用的方式  
  32.      */ 
  33.     @OnClose 
  34.     public void onClose() { 
  35.         webSocketSet.remove(this);  //从set中删掉 
  36.         subOnlineCount();           //线上数减1 
  37.         log.info("有一联接关掉!当前在线总数为"   getOnlineCount()); 
  38.     } 
  39.     /** 
  40.      * 接到手机客户端信息后启用的方式  
  41.      * @param message 手机客户端推送回来的信息 
  42.      */ 
  43.     @OnMessage 
  44.     public void onMessage(String message, Session session) { 
  45.         log.info("接到来源于对话框" sid "的信息内容:" message); 
  46.         //消息群发 
  47.         for (WebSocketServer item : webSocketSet) { 
  48.             try { 
  49.                 item.sendMessage(message); 
  50.             } catch (IOException e) { 
  51.                 e.printStackTrace(); 
  52.             } 
  53.         } 
  54.     } 
  55.     @OnError 
  56.     public void onError(Session session, Throwable error) { 
  57.         log.error("产生不正确"); 
  58.         error.printStackTrace(); 
  59.     } 
  60.     //完成网络服务器积极消息推送 
  61.     public void sendMessage(String message) throws IOException { 
  62.         this.session.getBasicRemote().sendText(message); 
  63.     } 
  64.     //群发消息自定信息 
  65.     public static void sendInfo(String message,@PathParam("sid") String sid)  
  66.         throws IOException { 
  67.         log.info("消息推送信息到对话框" sid ",消息推送內容:" message); 
  68.         for (WebSocketServer item : webSocketSet) { 
  69.             try { 
  70.                 //这儿能够设置只消息推送给这一sid的,为null则所有消息推送 
  71.                 if(sid==null) { 
  72.                     item.sendMessage(message); 
  73.                 }else if(item.sid.equals(sid)){ 
  74.                     item.sendMessage(message); 
  75.                 } 
  76.             } catch (IOException e) { 
  77.                 continue
  78.             } 
  79.         } 
  80.     } 
  81.     public static synchronized int getOnlineCount() { 
  82.         return onlineCount; 
  83.     } 
  84.     public static synchronized void addOnlineCount() { 
  85.         WebSocketServer.onlineCount ; 
  86.     } 
  87.     public static synchronized void subOnlineCount() { 
  88.         WebSocketServer.onlineCount--; 
  89.     } 

6、新创建controller包,建立Mycontroller类

 
  1. @Controller 
  2. public class MyController { 
  3.     //网页页面要求 
  4.     @GetMapping("/socket/{cid}"
  5.     public ModelAndView socket(@PathVariable String cid) { 
  6.         ModelAndView mav=new ModelAndView("/socket"); 
  7.         mav.addObject("cid", cid); 
  8.         return mav; 
  9.     } 
  10.     //消息推送api接口 
  11.     @ResponseBody 
  12.     @RequestMapping("/socket/push/{cid}"
  13.     public String pushToWeb(@PathVariable String cid,String message) { 
  14.         try { 
  15.             WebSocketServer.sendInfo(message,cid); 
  16.         } catch (IOException e) { 
  17.             e.printStackTrace(); 
  18.             return "消息推送不成功"
  19.         } 
  20.         return "发送成功"
  21.     } 
  22. }} 

7、新创建一个websocket.html网页页面

 
  1. <html> 
  2. <head> 
  3.     <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> 
  4.     <script type="text/javascript"
  5.         var socket; 
  6.         if (typeof (WebSocket) == "undefined") { 
  7.             console.log("您的电脑浏览器不兼容WebSocket"); 
  8.         } else { 
  9.             console.log("您的电脑浏览器适用WebSocket"); 
  10.             //完成化WebSocket目标,特定要联接的服务器ip与端口号  创建联接   
  11.             socket = new WebSocket("ws://localhost:8081/websocket/1"); 
  12.             //开启事情   
  13.             socket.onopen = function () { 
  14.                 console.log("Socket 已开启"); 
  15.                 socket.send("它是来源于手机客户端的信息"   location.href   new Date()); 
  16.             }; 
  17.             //得到 信息事情   
  18.             socket.onmessage = function (msg) { 
  19.                 console.log(msg.data); 
  20.             }; 
  21.             //关掉事情   
  22.             socket.onclose = function () { 
  23.                 console.log("Socket已关掉"); 
  24.             }; 
  25.             //发生了不正确事情   
  26.             socket.onerror = function () { 
  27.                 alert("Socket发生了不正确"); 
  28.             } 
  29.         } 
  30.     </script> 
  31. </head> 
  32. </html> 

如今开发设计网络服务器和网页页面就可以见到实际效果了。一般状况下Springboot2 Netty Websocket的组成方法更为的常见一下。这一仅仅得出了一个基本上的实例,你能依据自身的要求开展变更。

文中转载微信公众平台「愚公要移山」,能够根据下列二维码关心。转截文中请联络愚公要移山微信公众号。

the end
免责声明:本文不代表本站的观点和立场,如有侵权请联系本站删除!本站仅提供信息存储空间服务。