日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

websocket 本地可以服务器断开 springboot linux_SpringBoot+WebSocket实现简单的数据推送...

發(fā)布時間:2025/3/20 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 websocket 本地可以服务器断开 springboot linux_SpringBoot+WebSocket实现简单的数据推送... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

問題背景

為什么要要用websocket呢?websocket相對于傳統(tǒng)http協(xié)議有什么優(yōu)勢呢?

  • http協(xié)議有一個缺陷,就是通信只能由客戶端發(fā)起,服務(wù)器返回數(shù)據(jù),不能做到服務(wù)器主動向客戶端推送。這就導(dǎo)致了一個弊端,假如我要獲得服務(wù)器連續(xù)的狀態(tài)變化,那么我只能每隔一段時間向服務(wù)器發(fā)起請求,也就是所謂的輪詢,這就導(dǎo)致了大量的資源浪費。由此,websocket應(yīng)運而生,來解決這一痛點。

  • websocket使用tcp連接保持全雙工通信協(xié)議,服務(wù)器端比較容易實現(xiàn);

  • 數(shù)據(jù)格式比較輕量,通信比較高效;

  • 既能發(fā)送文本,也能發(fā)送二進(jìn)制數(shù)據(jù),沒有同源限制;

  • wbsocket響應(yīng)報文與http不同,如下

websocket響應(yīng)報文

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

搭建過程

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

websocket依賴

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

@Component
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}}
  • 編寫websocket推送服務(wù)端

@Component
@ServerEndpoint(value = "/websocket/logging")
public class LoggingWSServer {
private static final Logger LOGGER = LoggerFactory.getLogger(LoggingWSServer.class);
private static Map sessionMap = new ConcurrentHashMap<>();private static Gson gson = new Gson();private static Map map = new ConcurrentHashMap<>();@OnOpenpublic void onOpen(Session session) {new Thread(() -> { // 這里大家可以根據(jù)業(yè)務(wù)來優(yōu)化,使用線程池等手段 while(sessionMap.get(session.getId()) != null) { try { List 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("session斷開連接:{}" , session.getId()); } @OnMessage public void onMessage(String message,Session session) { LOGGER.info("收到客戶端的消息:{}",message); map.put("ret",message); send(session,gson.toJson(map)); } private void send(Session session, String toJson) { try { session.getBasicRemote().sendText(toJson); } catch (IOException e) { LOGGER.error("發(fā)送錯誤:{}",e.getMessage()); } } }

服務(wù)端api解釋:

  • OnOpen:在這個端點連接時被調(diào)用;

  • OnClose:與OnOpen相反,連接斷開時被調(diào)用

  • OnMessage:服務(wù)端收到客戶端的信息時被調(diào)用

  • OnError:當(dāng)然還有這個,上面沒有列出,這是發(fā)送錯誤時被調(diào)用

  • 編寫前端頁面,這里只展示js

//websocket對象
var websocket = null; //判斷當(dāng)前瀏覽器是否支持WebSocket if ('WebSocket' in window) {
//動態(tài)獲取域名或ip var hostname = window.location.hostname; port = window.location.port; websocket = new WebSocket("ws://"+hostname+":" + port + "/websocket/logging");
} else {
console.error("不支持WebSocket");
} //連接發(fā)生錯誤的回調(diào)方法 websocket.onerror = function (e) {
console.error("WebSocket連接發(fā)生錯誤" + e);
}; //連接成功建立的回調(diào)方法 websocket.onopen = function () {
console.log("WebSocket連接成功")
}; //接收到消息的回調(diào)方法 websocket.onmessage = function (event) {
console.log("數(shù)據(jù)是:", event.data );
var data = JSON.parse(event.data); if (data.push) {
// 內(nèi)容 var temp = template('tpl_data',{data : data.push});
console.log("模板==" + temp);
document.getElementById("tb").innerHTML = temp;
} if(data.ret) {
console.log(data.ret)
alert(data.ret); } } //發(fā)送消息 $('#send').click(function () {
websocket.send($('#sMsg').val());
});

前端頁面注意:

  • 編寫的時候一定要注意一個地方,就是new WebSocket 的地址,一定要和服務(wù)端推送的那個地址相同,不然的話,這里接收不到推送過來的數(shù)據(jù)。

  • 另外,有些瀏覽器可能不支持websocket,也沒關(guān)系,可以使用sockjs或者stomp.js,這是基于websocket的上層協(xié)議,大家可以自行去了解以下。不過要注意,sockjs 處理的url是http或者h(yuǎn)ttps,不在是以ws開頭的。

結(jié)語

今天就簡單的介紹到這里,有需要這個demo的,可以關(guān)注一下小編,后續(xù)小編會把代碼上傳到gitee,https://gitee.com/bigqianqian/springboot-websocket,可以了解下。

來源:

“IT大咖說”歡迎廣大技術(shù)人員投稿,投稿郵箱:aliang@itdks.com

來都來了,走啥走,留個言唄~

?IT大咖說 ?|??關(guān)于版權(quán)?

由“IT大咖說(ID:itdakashuo)”原創(chuàng)的文章,轉(zhuǎn)載時請注明作者、出處及微信公眾號。投稿、約稿、轉(zhuǎn)載請加微信:ITDKS10(備注:投稿),茉莉小姐姐會及時與您聯(lián)系!

感謝您對IT大咖說的熱心支持!

相關(guān)推薦

推薦文章

  • Terminal Preview 1.4 發(fā)布,支持超鏈接

  • 線上JVM調(diào)優(yōu)實踐,FullGC40次/天到10天一次的優(yōu)化

  • Andy邀你共探未來“數(shù)據(jù)酷”世界

  • 很少用到,但掏出來讓人感到牛逼的Web API

  • Win10又翻車,微軟承認(rèn)9月補(bǔ)丁存在Bug,SSD硬盤遭殃

  • Linux Lab v0.5 正式發(fā)布,功能強(qiáng)大,用法簡單

總結(jié)

以上是生活随笔為你收集整理的websocket 本地可以服务器断开 springboot linux_SpringBoot+WebSocket实现简单的数据推送...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。