SpringBoot+WebSocket實現簡單的數據推送

2020-09-20 詩意凌風

問題背景

為什麼要要用websocket呢?websocket相對於傳統http協議有什麼優勢呢?

  • http協議有一個缺陷,就是通信只能由客戶端發起,伺服器返回數據,不能做到伺服器主動向客戶端推送。這就導致了一個弊端,假如我要獲得伺服器連續的狀態變化,那麼我只能每隔一段時間向伺服器發起請求,也就是所謂的輪詢,這就導致了大量的資源浪費。由此,websocket應運而生,來解決這一痛點。
  • websocket使用tcp連接保持全雙工通信協議,伺服器端比較容易實現;
  • 數據格式比較輕量,通信比較高效;
  • 既能發送文本,也能發送二進位數據,沒有同源限制;
  • wbsocket響應報文與http不同,如下

websocket響應報文

好了,簡單的了解一下,我們來看看springboot+websocket實現推送的過程,以下是個簡單的demo。

搭建過程

  • 首先我們初始化一個spring boot項目,大家可以根據自己的習慣去官網下載或者用idea來生成,這裡我不多說,主要的是引入websocket依賴,如下圖;

websocket依賴

  • 編寫websocket配置類,這裡直接new 一個ServerEndpointExporter就行了

@Componentpublic class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); }}

  • 編寫websocket推送服務端

@Component@ServerEndpoint(value = &34;)public class LoggingWSServer { private static final Logger LOGGER = LoggerFactory.getLogger(LoggingWSServer.class); private static Map<String, Session> sessionMap = new ConcurrentHashMap<>(); private static Gson gson = new Gson(); private static Map<String,Object> map = new ConcurrentHashMap<>(); @OnOpen public void onOpen(Session session) { new Thread(() -> { // 這裡大家可以根據業務來優化,使用線程池等手段 while(sessionMap.get(session.getId()) != null) { try { List<AaaServer> list = aaaServerService.findList(); if(session.isOpen()) { send(session, gson.toJson(list)); } Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } @OnClose public void onClose(Session session) { sessionMap.remove(session.getId()); LOGGER.info(&34; , session.getId()); } @OnMessage public void onMessage(String message,Session session) { LOGGER.info(&34;,message); map.put(&34;,message); send(session,gson.toJson(map)); } private void send(Session session, String toJson) { try { session.getBasicRemote().sendText(toJson); } catch (IOException e) { LOGGER.error(&34;,e.getMessage()); } } }

服務端api解釋:

  • OnOpen:在這個端點連接時被調用;
  • OnClose:與OnOpen相反,連接斷開時被調用
  • OnMessage:服務端收到客戶端的信息時被調用
  • OnError:當然還有這個,上面沒有列出,這是發送錯誤時被調用
  • 編寫前端頁面,這裡只展示js

//websocket對象 var websocket = null; //判斷當前瀏覽器是否支持WebSocket if (&39; in window) { //動態獲取域名或ip var hostname = window.location.hostname; port = window.location.port; websocket = new WebSocket(&34;+hostname+&34; + port + &34;); } else { console.error(&34;); } //連接發生錯誤的回調方法 websocket.onerror = function (e) { console.error(&34; + e); }; //連接成功建立的回調方法 websocket.onopen = function () { console.log(&34;) }; //接收到消息的回調方法 websocket.onmessage = function (event) { console.log(&34;, event.data ); var data = JSON.parse(event.data); if (data.push) { // 內容 var temp = template(&39;,{data : data.push}); console.log(&34; + temp); document.getElementById(&34;).innerHTML = temp; } if(data.ret) { console.log(data.ret) alert(data.ret); } } //發送消息 $(&send&39;39;).val()); });

前端頁面注意

  • 編寫的時候一定要注意一個地方,就是new WebSocket 的地址,一定要和服務端推送的那個地址相同,不然的話,這裡接收不到推送過來的數據。
  • 另外,有些瀏覽器可能不支持websocket,也沒關係,可以使用sockjs或者stomp.js,這是基於websocket的上層協議,大家可以自行去了解以下。不過要注意,sockjs 處理的url是http或者https,不在是以ws開頭的。

結語

今天就簡單的介紹到這裡,有需要這個demo的,可以關注一下小編,後續小編會把代碼上傳到gitee,https://gitee.com/bigqianqian/springboot-websocket,可以了解下。下篇文章小編將會介紹websocket點對點推送和廣播,喜歡的朋友點個關注唄[奮鬥][奮鬥][奮鬥],也可以動動手評論下,留下你的理解,小編與你共同成長!

相關焦點

  • SpringBoot+WebSocket實現服務端、客戶端
    ,之後本人也會陸續寫關於springboot開發常用功能的文章。什麼場景下會要使用到websocket的呢?websocket主要功能就是實現網絡通訊,比如說最經典的客服聊天窗口、您有新的消息通知,或者是項目與項目之間的通訊,都可以採用websocket來實現。
  • SpringBoot項目中websocket報錯問題
    介紹 系統使用springboot開發,用到了websocket推送消息到頁面,但是登陸系統後,報錯信息如下:WebSocket connection to &39; failed: Error during WebSocket handshake: Unexpected response code: 404.
  • SpringBoot項目中websocket報錯問題
    介紹系統使用springboot開發,用到了websocket推送消息到頁面,但是登陸系統後,報錯信息如下:WebSocket connection to 'ws://192.168.1.141:8089/finesys_user/lehoon' failed: Error during
  • SpringBoot+WebSocket實現廣播和點對點推送
    Controllerpublic class MessagController { @Autowired private SimpMessagingTemplate messagingTemplate; @MessageMapping("/subcrib") public void subcrib(ReveiceMsg reveiceMsg) { //ReveiceMsg 是簡單的自定義的消息類
  • Springboot整合Websocket案例(後端向前端主動推送消息)
    在手機上相信都有來自伺服器的推送消息,比如一些及時的新聞信息,這篇文章主要就是實現這個功能,只演示一個基本的案例。使用的是websocket技術。一、什麼是websocketWebSocket協議是基於TCP的一種新的網絡協議。
  • 使用websocket技術實現後端向前端的推送消息
    打開APP 使用websocket技術實現後端向前端的推送消息 扣丁學堂 發表於 2020-01-20 17:43:00 在手機上相信都有來自伺服器的推送消息,比如一些及時的新聞信息,這篇文章主要就是實現這個功能,只演示一個基本的案例。
  • SpringBoot+Netty+Websocket整合案例(實現基本的聊天功能)
    之前使用Springboot整合了websocket,實現了一個後端向前端推送信息的基本小案例,這篇文章主要是增加了一個新的框架就是Netty,實現一個高性能的websocket伺服器,並結合前端代碼,實現一個基本的聊天功能。你可以根據自己的業務需求進行更改。
  • Django添加基於websocket的實時通信,主動推送
    webSocket使得客戶端和伺服器之間的數據交換變得更加簡單,允許服務端主動向客戶端推送數據。在WebSocket API中,瀏覽器和伺服器只需要完成一次握手,兩者之間就直接可以創建持久性的連接,並進行雙向數據傳輸。
  • 基於MQ和Websocket實現站內消息和公告推送
    在常規的管理系統裡實現站內信和公告的功能是很有必要的,今天我們就來看一下下面的這一種實現方式。當然老規則,還是要對這次用到的技術有一個大概的了解。ActiveMQ是一種開源的基於JMS(Java Message Servie)規範的一種消息中間件的實現,ActiveMQ的設計目標是提供標準的,面向消息的,能夠跨越多語言和多系統的應用集成消息通信中間件。Websocket 是一種在單個TCP連接上進行全雙工通信的協議,使得客戶端和伺服器之間的數據交換變得更加簡單,允許服務端主動向客戶端推送數據。
  • Uniapp使用GoEasy實現websocket實時通訊
    搭建websocket消息推送服務,必須要考慮的幾個問題》而GoEasy是一個成熟穩定的websocket企業級PAAS服務平臺,開發人員不需要考慮websocket服務端的搭建,只需要幾行代碼,就可以輕鬆實現客戶端與客戶端之間,伺服器與客戶端之間的的websocket通信,不需要考慮性能,安全,高可用集群的問題。
  • Springboot實現的直播點播
    介紹Springboot實現的http-flv、websocket-flv直播點播,支持rtsp、本地文件、rtmp等多種源,h5純js播放(不依賴flash)軟體架構通過javacv推拉流存到內存裡,直接輸出到前端播放,現在只是一個播放實現
  • Hyperf+RabbitMQ+WebSocket實現大屏幕消息推送
    作者:八重櫻來源:www.cnblogs.com/a609251438/p/12713467.html介紹基於 Hyperf+ WebSocket +RabbitMQ 實現的一個簡單大屏幕的消息推送。WebSocket 服務composer require hyperf/websocket-server
  • netty-socketio+vue實現服務端推送消息到前端
    正常情況下一個前後端的交互過程是這樣的:用戶操作界面觸發前端代碼前端請求後端並提交數據後端響應數據給前端前端渲染結果展示給用戶大部分情況以上流程就可以解決,但有一些特殊情況下例外,比如伺服器無法馬上處理一個請求或伺服器通過定時任務自動處理任務,並且需要在以後某個時間處理完成後通知用戶處理結果
  • Springboot加layui實現的HelpDesk系統
    在這兩大框架基礎之上,又引入了shiro作為權限登錄校驗,使用websocket實現消息的實時推送和接收。這裡,我再順便介紹一下HelpDesk系統。百度上說:HelpDesk是指IT專業技術人員為了保障IT桌面能夠提供正常的功能和服務,而對其進行的一系列的維護活動。它包括對IT桌面的硬體層、基礎軟體層和應用軟體層的維護,主要包括安裝、配置、升級、故障診斷和排除等活動。
  • 未讀消息(小紅點),RabbitMQ實時消息推送實踐,賊簡單
    前幾天粉絲群裡有個小夥伴問過:web 頁面的未讀消息(小紅點)怎麼實現比較簡單,剛好本周手頭有類似的開發任務,索性就整理出來供小夥伴們參考,沒準哪天就能用得上呢。之前在 《springboot + rabbitmq 做智能家居》 中說過可以用 rabbitmq 的 MQTT 協議做智能家居的指令推送,裡邊還提到過能用 MQTT 協議做 web 的消息推送,而未讀消息(小紅點)功能剛好應用到實時消息推送了。MQTT 協議就不再贅述了,沒接觸過的同學翻翻前邊的文章溫習一下吧,今天還是主要以實踐為主!
  • 使用iris框架和websocket開發簡單的頁面訪問次數記錄功能
    Iris 框架裡內置 websocket 模塊,可以實現 websocket 伺服器,核心是封裝了 neffos 開源模塊。Websocket 可實現全雙工通信,也就是客戶端和伺服器在建立連接之後,可以互相接收和發送消息,具有長連接的特性。可以利用 websocket 實現移動端消息推送,地圖位置實時顯示等功能,提高用戶體驗。
  • 那些很重要,但是不常用的技術,websocket
    而WebServer不能主動的推送數據給Browser/UA,當初這麼設計http協議也是有原因的,假設WebServer能主動的推送數據給Browser/UA,那Browser/UA就太容易受到攻擊,一些廣告商也會主動的把一些廣告信息在不經意間強行的傳輸給客戶端,這不能不說是一個災難。那麼單向的http協議給現在的網站或Web應用程式開發帶來了哪些問題呢?
  • 從0到1的彈幕系統——實現超簡單的websocket協議
    由於golang在並發場景中的優越表現,我們選擇使用golang來實現彈幕系統。websocket協議實現彈幕系統肯定繞不開websocket協議,使用彈幕的系統基本都會有H5應用,H5應用上的彈幕系統,大家想到的肯定是用websocket實現。
  • vue + webSocket 實時任務信息通知
    它的最大特點就是,伺服器可以主動向客戶端推送信息,客戶端也可以主動向伺服器發送信息,是真正的雙向平等對話,屬於伺服器推送技術的一種。特點建立在TCP協議之上,服務端的實現比較容易; 與HTTP協議有著良好的兼容性。
  • workerman搭建websocket入門教程,簡單實用
    那麼我們該如何實現實時通訊呢?最常用的一種就是Websocket。後端能實現websocket的語方很多,例如Node.js,Go,Python,dotnet core,java。小智選擇Workerman的理由不僅是因為它的性能不錯,終其原因是:作為PHP開發者之一的我,workerman布署簡單,學習成本低是最主要的原因。說到workerman同學們可能會說swoole也很不錯。沒錯swoole也是個好東西,小智會開專文來講述它的。好了,現在我們開始進入正題,如何使用workerman創建屬於自己的websocket伺服器。