最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在vue中使用SockJS實(shí)現(xiàn)webSocket通信的過(guò)程

 更新時(shí)間:2018年08月29日 08:24:25   作者:慢思考快行動(dòng)  
最近接到一個(gè)業(yè)務(wù)需求,需要做一個(gè)聊天信息的實(shí)時(shí)展示的界面,下面小編把實(shí)現(xiàn)過(guò)程記錄下來(lái),對(duì)vue中使用SockJS實(shí)現(xiàn)webSocket通信的相關(guān)知識(shí)感興趣的朋友一起看看吧

最近接到一個(gè)業(yè)務(wù)需求,需要做一個(gè)聊天信息的實(shí)時(shí)展示的界面,這就需要和服務(wù)器端建立webSocket連接,從而實(shí)現(xiàn)數(shù)據(jù)的實(shí)時(shí)獲取和視圖的實(shí)時(shí)刷新.在此將我的實(shí)現(xiàn)記錄下來(lái),希望可以給有同樣需求的人一些幫助.廢話少說(shuō),下面我就來(lái)講一下我的實(shí)現(xiàn)過(guò)程:

socksjs

•客戶端和服務(wù)器端api盡可能簡(jiǎn)潔,盡量靠近websocket api
•支持服務(wù)端擴(kuò)展和負(fù)載均衡技術(shù)
•傳輸層應(yīng)該全面支持跨域通信
•如果受到代理服務(wù)器的限制,傳輸層能優(yōu)雅地從一種方式回退到另一種方式
•盡可能快地建立連接
•客戶端只是純粹的JavaScript,不需要flash
•客戶端JavaScript必須經(jīng)過(guò)嚴(yán)格的測(cè)試
•服務(wù)器端代碼盡可能簡(jiǎn)單,降低用另一種語(yǔ)言重寫server的代價(jià)

前提

要進(jìn)行文章中的代碼的測(cè)試,需要服務(wù)端端開(kāi)發(fā)人員配合你,提供相關(guān)的通信接口.來(lái)完成客戶端和服務(wù)端的通信.實(shí)現(xiàn)通信,我們需要用到另個(gè)模塊 sockjs-client 模塊和 stomjs 模塊,接下來(lái)我會(huì)先對(duì)這兩個(gè)模塊做一個(gè)簡(jiǎn)單的介紹.

關(guān)于實(shí)時(shí)通信

實(shí)現(xiàn)實(shí)時(shí)通信,我們通常有三種方法:

ajax輪詢 ajax輪詢的原理非常簡(jiǎn)單,讓瀏覽器每隔幾秒就像服務(wù)器發(fā)送一個(gè)請(qǐng)求,詢問(wèn)服務(wù)器是否有新的信息.

http 長(zhǎng)輪詢 長(zhǎng)輪詢的機(jī)制和ajax輪詢差不多,都是采用輪詢的方式,不過(guò)才去的是阻塞模型(一直打電話,沒(méi)收到就不掛電話),也就是說(shuō),客戶端發(fā)起鏈接后,如果沒(méi)有消息,就一直不返回response給客戶端.知道有新的消息才返回,返回完之后,客戶端再此建立連接,周而復(fù)始.

WebSocket WebSocket是HTML5開(kāi)始提供的一種在單個(gè)TCP連接上進(jìn)行全雙工通訊的協(xié)議.在WebSocket API中,瀏覽器和服務(wù)器只需要做一個(gè)握手的動(dòng)作,然后,瀏覽器和服務(wù)器之間就形成了一條快速通道。兩者之間就直接可以數(shù)據(jù)互相傳送,不需要繁瑣的詢問(wèn)和等待. 從上面的介紹很容易看出來(lái),ajax輪詢和長(zhǎng)輪詢都是非常耗費(fèi)資源的,ajax輪詢需要服務(wù)器有很快的處理速度和資源,http長(zhǎng)輪詢需要有很高的并發(fā),也就是同時(shí)接待客戶的能力.而WebSocket,只需要經(jīng)過(guò)一次HTTP請(qǐng)求,就可以與服務(wù)端進(jìn)行源源不斷的消息收發(fā)了.

sockjs-client

sockjs-client 是從SockJS中分離出來(lái)的用于客戶端使用的通信模塊.所以我們就直接來(lái)看看SockJS. SockJS是一個(gè)瀏覽器的JavaScript庫(kù),它提供了一個(gè)類似于網(wǎng)絡(luò)的對(duì)象,SockJS提供了一個(gè)連貫的,跨瀏覽器的JavaScriptAPI,它在瀏覽器和Web服務(wù)器之間創(chuàng)建了一個(gè)低延遲,全雙工,跨域通信通道. 你可能會(huì)問(wèn),我為什么不直接用原生的WebSocket而要使用SockJS呢?這得益于SockJS的一大特性,一些瀏覽器中缺少對(duì)WebSocket的支持,因此,回退選項(xiàng)是必要的,而Spring框架提供了基于SockJS協(xié)議的透明的回退選項(xiàng)。SockJS提供了瀏覽器兼容性,優(yōu)先使用原生的WebSocket,如果某個(gè)瀏覽器不支持WebSocket,SockJS會(huì)自動(dòng)降級(jí)為輪詢.

stomjs

STOMP(Simple Text-Orientated Messaging Protocol) 面向消息的簡(jiǎn)單文本協(xié)議; WebSocket是一個(gè)消息架構(gòu),不強(qiáng)制使用任何特定的消息協(xié)議,它依賴于應(yīng)用層解釋消息的含義. 與HTTP不同,WebSocket是處在TCP上非常薄的一層,會(huì)將字節(jié)流轉(zhuǎn)化為文本/二進(jìn)制消息,因此,對(duì)于實(shí)際應(yīng)用來(lái)說(shuō),WebSocket的通信形式層級(jí)過(guò)低,因此,可以在 WebSocket 之上使用STOMP協(xié)議,來(lái)為瀏覽器 和 server間的 通信增加適當(dāng)?shù)南⒄Z(yǔ)義。

STOMP與WebSocket 的關(guān)系:

  • HTTP協(xié)議解決了web瀏覽器發(fā)起請(qǐng)求以及web服務(wù)器響應(yīng)請(qǐng)求的細(xì)節(jié),假設(shè)HTTP協(xié)議不存在,只能使用TCP套接字來(lái)編寫web應(yīng)用,你可能認(rèn)為這是一件瘋狂的事情;
  • 直接使用WebSocket(SockJS)就很類似于使用TCP套接字來(lái)編寫web應(yīng)用,因?yàn)闆](méi)有高層協(xié)議,就需要我們定義應(yīng)用間發(fā)送消息的語(yǔ)義,還需要確保連接的兩端都能遵循這些語(yǔ)義;
  • 同HTTP在TCP套接字上添加請(qǐng)求-響應(yīng)模型層一樣,STOMP在WebSocket之上提供了一個(gè)基于幀的線路格式層,用來(lái)定義消息語(yǔ)義.

代碼實(shí)現(xiàn)

代碼中除了最基本的連接,還設(shè)置了一個(gè)定時(shí)器,每隔十秒發(fā)送一條數(shù)據(jù)到服務(wù)器端,如果發(fā)生錯(cuò)誤,catch這個(gè)錯(cuò)誤,重新建立連接.

// 安裝并引入相關(guān)模塊
import SockJS from 'sockjs-client'; 
import Stomp from 'stompjs';
export default {
 data() {
  return {
  dataList: []
  };
 },
 mounted:function(){
  this.initWebSocket();
 },
 beforeDestroy: function () {
  // 頁(yè)面離開(kāi)時(shí)斷開(kāi)連接,清除定時(shí)器
  this.disconnect();
  clearInterval(this.timer);
 },
 methods: {
  initWebSocket() {
  this.connection();
  let self = this;
  // 斷開(kāi)重連機(jī)制,嘗試發(fā)送消息,捕獲異常發(fā)生時(shí)重連
  this.timer = setInterval(() => {
   try {
   self.stompClient.send("test");
   } catch (err) {
   console.log("斷線了: " + err);
   self.connection();
   }
  }, 5000);
  },
  removeTab(targetName) {
  console.log(targetName)
  },
  connection() {
  // 建立連接對(duì)象
  this.socket = new SockJS('http://xxxxxx:8089/ws');//連接服務(wù)端提供的通信接口,連接以后才可以訂閱廣播消息和個(gè)人消息
  // 獲取STOMP子協(xié)議的客戶端對(duì)象
  this.stompClient = Stomp.over(this.socket);
  // 定義客戶端的認(rèn)證信息,按需求配置
  var headers = {
   login: 'mylogin',
   passcode: 'mypasscode',
   // additional header
   'client-id': 'my-client-id'
  };
  // 向服務(wù)器發(fā)起websocket連接
  this.stompClient.connect(headers,(frame) => {
   this.stompClient.subscribe('/topic/chat_msg', (msg) => { // 訂閱服務(wù)端提供的某個(gè)topic
   consolel.log(msg.body); // msg.body存放的是服務(wù)端發(fā)送給我們的信息
   });
  }, (err) => {
   
  });

  },
  disconnect() {
  if (this.stompClient != null) {
   this.stompClient.disconnect();
   console.log("Disconnected");
  }
  }
 }
};

總結(jié)

以上所述是小編給大家介紹的在vue中使用SockJS實(shí)現(xiàn)webSocket通信的過(guò)程,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • vue 實(shí)現(xiàn)微信浮標(biāo)效果

    vue 實(shí)現(xiàn)微信浮標(biāo)效果

    微信的浮窗,大伙應(yīng)該都用過(guò),當(dāng)我們正在閱讀一篇公眾號(hào)文章時(shí),突然需要處理微信消息,點(diǎn)擊浮窗,在微信上會(huì)有個(gè)浮標(biāo),點(diǎn)擊浮標(biāo)可以再次回到文章。今天小編抽空給大家介紹vue 實(shí)現(xiàn)微信浮標(biāo)效果,感興趣的朋友一起看看吧
    2019-09-09
  • vue前端獲取本地IP地址代碼實(shí)例

    vue前端獲取本地IP地址代碼實(shí)例

    再做前端頁(yè)面的時(shí)候,想獲取本地的ip地址,可能是為了和服務(wù)器通信,可能是為了展示,無(wú)論哪種,下面給大家總結(jié)下方法,這篇文章主要給大家介紹了關(guān)于vue前端獲取本地IP地址的相關(guān)資料,需要的朋友可以參考下
    2024-05-05
  • 如何查看vue-cli版本的兩個(gè)命令

    如何查看vue-cli版本的兩個(gè)命令

    這篇文章主要介紹了如何查看vue-cli版本的兩個(gè)命令問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • vue中動(dòng)態(tài)參數(shù)與計(jì)算屬性的使用方法

    vue中動(dòng)態(tài)參數(shù)與計(jì)算屬性的使用方法

    在平時(shí)vue開(kāi)發(fā)中,我們經(jīng)常會(huì)用到計(jì)算屬性(計(jì)算屬性只有在它的相關(guān)依賴發(fā)生改變時(shí)才會(huì)重新求值)來(lái)計(jì)算我們需要的數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于vue中動(dòng)態(tài)參數(shù)與計(jì)算屬性使用的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • Vue2?this直接獲取data和methods原理解析

    Vue2?this直接獲取data和methods原理解析

    這篇文章主要為大家介紹了Vue2?this直接獲取data和methods原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • vue如何設(shè)置定時(shí)器和清理定時(shí)器

    vue如何設(shè)置定時(shí)器和清理定時(shí)器

    這篇文章主要介紹了vue如何設(shè)置定時(shí)器和清理定時(shí)器,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • vue+vue-fullpage實(shí)現(xiàn)整屏滾動(dòng)頁(yè)面的示例代碼(直播平臺(tái)源碼)

    vue+vue-fullpage實(shí)現(xiàn)整屏滾動(dòng)頁(yè)面的示例代碼(直播平臺(tái)源碼)

    這篇文章主要介紹了vue+vue-fullpage實(shí)現(xiàn)整屏滾動(dòng)頁(yè)面,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • 解決vuex刷新數(shù)據(jù)消失問(wèn)題

    解決vuex刷新數(shù)據(jù)消失問(wèn)題

    這篇文章主要介紹了解決vuex刷新數(shù)據(jù)消失問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • vue前端開(kāi)發(fā)層次嵌套組件的通信詳解

    vue前端開(kāi)發(fā)層次嵌套組件的通信詳解

    vue通過(guò)provide & inject兩個(gè)關(guān)鍵字完成父組件向子孫組件直接傳值,很像子類能夠使用父類的屬性一樣方便。provide & inject一般用于多層之間的傳值,兩層之間還是使用props進(jìn)行
    2021-10-10
  • vue中使用Tinymce的示例代碼

    vue中使用Tinymce的示例代碼

    這篇文章主要介紹了vue中使用Tinymce的示例,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08

最新評(píng)論

西乌| 天峨县| 克拉玛依市| 高邮市| 安仁县| 鹤壁市| 鄂伦春自治旗| 天气| 赤峰市| 抚顺市| 永吉县| 法库县| 涿鹿县| 长子县| 饶阳县| 南投市| 达日县| 阜新市| 安国市| 礼泉县| 龙州县| 松江区| 垣曲县| 金塔县| 吐鲁番市| 威宁| 绥阳县| 赤壁市| 宁国市| 昌吉市| 通海县| 衡南县| 西贡区| 建湖县| 澄江县| 乌拉特后旗| 蓬安县| 林甸县| 双流县| 河曲县| 宣武区|