成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Springboot整合Websocket實現后端向前端主動推送消息案例

開發 架構
在手機上相信都有來自服務器的推送消息,比如一些及時的新聞信息,這篇文章主要就是實現這個功能,只演示一個基本的案例。使用的是websocket技術。

[[389702]]

在手機上相信都有來自服務器的推送消息,比如一些及時的新聞信息,這篇文章主要就是實現這個功能,只演示一個基本的案例。使用的是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.     //推送數據接口 
  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對象,指定要連接的服務器地址與端口  建立連接   
  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的組合方式更加的常用一下。這個只是給出了一個基本的案例,你可以根據自己的需求進行更改。

本文轉載自微信公眾號「愚公要移山」,可以通過以下二維碼關注。轉載本文請聯系愚公要移山公眾號。

 

責任編輯:武曉燕 來源: 愚公要移山
相關推薦

2021-02-05 07:28:11

SpringbootNettyWebsocke

2023-08-09 08:01:00

WebSockett服務器web

2021-03-25 08:29:33

SpringBootWebSocket即時消息

2023-08-14 08:01:12

websocket8g用戶

2024-09-11 08:35:54

2024-09-02 09:31:19

2024-08-02 09:00:17

NettyWebSocketNIO

2023-01-13 00:02:41

2023-01-05 09:17:58

2023-09-04 08:00:53

提交事務消息

2023-10-12 08:00:48

2024-11-14 12:22:37

SpringMail郵件

2021-04-15 09:17:01

SpringBootRocketMQ

2017-05-09 10:07:34

SpringbootDubboZooKeeper

2024-09-12 14:50:08

2024-11-14 11:56:45

2022-06-28 08:37:07

分布式服務器WebSocket

2013-05-17 15:34:45

2022-01-10 11:58:51

SpringBootPulsar分布式

2025-06-18 07:09:05

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美福利视频 | 久久久精品一区二区三区 | 国产视频一区二区 | 午夜丰满寂寞少妇精品 | www.日韩 | 九九亚洲 | 成人精品一区二区三区四区 | 国产一极毛片 | 黄色一级免费观看 | 国产精品久久国产精品久久 | 欧美日韩美女 | 午夜一区二区三区在线观看 | 日韩欧美一区二区三区四区 | 日韩免费av | 久久免费小视频 | 日韩免费福利视频 | 男人的天堂久久 | 91精品亚洲 | 在线91| 激情在线视频网站 | 日韩免费一区二区 | 亚洲二区在线观看 | 国产精品高潮呻吟久久 | 亚洲一一在线 | 一区在线播放 | 国产福利在线看 | 麻豆av一区二区三区久久 | 91精品久久 | 国产xxxx搡xxxxx搡麻豆 | 国产a区 | 国产jizz女人多喷水99 | 欧美一区二区三区国产精品 | 免费在线色 | 五月婷婷在线播放 | 麻豆久久久久 | 欧美一级免费黄色片 | 日本在线观看视频 | 国产精品久久网 | 伊人伊人 | 久久人| 中文精品视频 |