websocket 本地可以服务器断开 springboot linux_SpringBoot+WebSocket实现简单的数据推送...
問(wèn)題背景
為什么要要用websocket呢?websocket相對(duì)于傳統(tǒng)http協(xié)議有什么優(yōu)勢(shì)呢?
http協(xié)議有一個(gè)缺陷,就是通信只能由客戶(hù)端發(fā)起,服務(wù)器返回?cái)?shù)據(jù),不能做到服務(wù)器主動(dòng)向客戶(hù)端推送。這就導(dǎo)致了一個(gè)弊端,假如我要獲得服務(wù)器連續(xù)的狀態(tài)變化,那么我只能每隔一段時(shí)間向服務(wù)器發(fā)起請(qǐng)求,也就是所謂的輪詢(xún),這就導(dǎo)致了大量的資源浪費(fèi)。由此,websocket應(yīng)運(yùn)而生,來(lái)解決這一痛點(diǎn)。
websocket使用tcp連接保持全雙工通信協(xié)議,服務(wù)器端比較容易實(shí)現(xiàn);
數(shù)據(jù)格式比較輕量,通信比較高效;
既能發(fā)送文本,也能發(fā)送二進(jìn)制數(shù)據(jù),沒(méi)有同源限制;
wbsocket響應(yīng)報(bào)文與http不同,如下
websocket響應(yīng)報(bào)文
好了,簡(jiǎn)單的了解一下,我們來(lái)看看springboot+websocket實(shí)現(xiàn)推送的過(guò)程,以下是個(gè)簡(jiǎn)單的demo。
搭建過(guò)程
首先我們初始化一個(gè)spring boot項(xiàng)目,大家可以根據(jù)自己的習(xí)慣去官網(wǎng)下載或者用idea來(lái)生成,這里我不多說(shuō),主要的是引入websocket依賴(lài),如下圖;
websocket依賴(lài)
編寫(xiě)websocket配置類(lèi),這里直接new 一個(gè)ServerEndpointExporter就行了
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}}
編寫(xiě)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ù)來(lái)優(yōu)化,使用線(xiàn)程池等手段 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斷開(kāi)連接:{}" , session.getId()); } @OnMessage public void onMessage(String message,Session session) { LOGGER.info("收到客戶(hù)端的消息:{}",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ā)送錯(cuò)誤:{}",e.getMessage()); } } }
服務(wù)端api解釋:
OnOpen:在這個(gè)端點(diǎn)連接時(shí)被調(diào)用;
OnClose:與OnOpen相反,連接斷開(kāi)時(shí)被調(diào)用
OnMessage:服務(wù)端收到客戶(hù)端的信息時(shí)被調(diào)用
OnError:當(dāng)然還有這個(gè),上面沒(méi)有列出,這是發(fā)送錯(cuò)誤時(shí)被調(diào)用
編寫(xiě)前端頁(yè)面,這里只展示js
var websocket = null; //判斷當(dāng)前瀏覽器是否支持WebSocket if ('WebSocket' in window) {
//動(dòng)態(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ā)生錯(cuò)誤的回調(diào)方法 websocket.onerror = function (e) {
console.error("WebSocket連接發(fā)生錯(cuò)誤" + 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());
});
前端頁(yè)面注意:
編寫(xiě)的時(shí)候一定要注意一個(gè)地方,就是new WebSocket 的地址,一定要和服務(wù)端推送的那個(gè)地址相同,不然的話(huà),這里接收不到推送過(guò)來(lái)的數(shù)據(jù)。
另外,有些瀏覽器可能不支持websocket,也沒(méi)關(guān)系,可以使用sockjs或者stomp.js,這是基于websocket的上層協(xié)議,大家可以自行去了解以下。不過(guò)要注意,sockjs 處理的url是http或者h(yuǎn)ttps,不在是以ws開(kāi)頭的。
結(jié)語(yǔ)
今天就簡(jiǎn)單的介紹到這里,有需要這個(gè)demo的,可以關(guān)注一下小編,后續(xù)小編會(huì)把代碼上傳到gitee,https://gitee.com/bigqianqian/springboot-websocket,可以了解下。
來(lái)源:
“IT大咖說(shuō)”歡迎廣大技術(shù)人員投稿,投稿郵箱:aliang@itdks.com
來(lái)都來(lái)了,走啥走,留個(gè)言唄~?IT大咖說(shuō) ?|??關(guān)于版權(quán)?
由“IT大咖說(shuō)(ID:itdakashuo)”原創(chuàng)的文章,轉(zhuǎn)載時(shí)請(qǐng)注明作者、出處及微信公眾號(hào)。投稿、約稿、轉(zhuǎn)載請(qǐng)加微信:ITDKS10(備注:投稿),茉莉小姐姐會(huì)及時(shí)與您聯(lián)系!
感謝您對(duì)IT大咖說(shuō)的熱心支持!
相關(guān)推薦
推薦文章
Terminal Preview 1.4 發(fā)布,支持超鏈接
線(xiàn)上JVM調(diào)優(yōu)實(shí)踐,FullGC40次/天到10天一次的優(yōu)化
Andy邀你共探未來(lái)“數(shù)據(jù)酷”世界
很少用到,但掏出來(lái)讓人感到牛逼的Web API
Win10又翻車(chē),微軟承認(rèn)9月補(bǔ)丁存在Bug,SSD硬盤(pán)遭殃
Linux Lab v0.5 正式發(fā)布,功能強(qiáng)大,用法簡(jiǎn)單
總結(jié)
以上是生活随笔為你收集整理的websocket 本地可以服务器断开 springboot linux_SpringBoot+WebSocket实现简单的数据推送...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql数据类型查询命令_Linux命
- 下一篇: linux phpinfo mysql_