websocket 本地可以服务器断开 springboot linux_SpringBoot+WebSocket实现简单的数据推送...
問題背景
為什么要要用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就行了
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}}
編寫websocket推送服務(wù)端
@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
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql数据类型查询命令_Linux命
- 下一篇: arm-linux-gcc 头文件搜索路