在vue中使用SockJS實現(xiàn)webSocket通信

1.簡單介紹

基于webSocket通信的庫主要有 socket.io务嫡,SockJS,這次用的是 SockJS漆改。

2.前提

要進行文章中的代碼的測試,需要后端開發(fā)人員配合你,提供相關(guān)的通信接口.來完成客戶端和服務(wù)端的通信.實現(xiàn)通信,我們需要用到另個模塊sockjs-client模塊和stomjs模塊

關(guān)于實時通信

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

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

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

3.WebSocket---WebSocket是HTML5開始提供的一種在單個TCP連接上進行全雙工通訊的協(xié)議.在WebSocket API中心铃,瀏覽器和服務(wù)器只需要做一個握手的動作,然后挫剑,瀏覽器和服務(wù)器之間就形成了一條快速通道去扣。兩者之間就直接可以數(shù)據(jù)互相傳送,不需要繁瑣的詢問和等待.

從上面的介紹很容易看出來,ajax輪詢和長輪詢都是非常耗費資源的,ajax輪詢需要服務(wù)器有很快的處理速度和資源,http長輪詢需要有很高的并發(fā),也就是同時接待客戶的能力.而WebSocket,只需要經(jīng)過一次HTTP請求,就可以與服務(wù)端進行源源不斷的消息收發(fā)了.

sockjs-client

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

stomjs

STOMP(Simple Text-Orientated Messaging Protocol) 面向消息的簡單文本協(xié)議;

WebSocket是一個消息架構(gòu),不強制使用任何特定的消息協(xié)議,它依賴于應(yīng)用層解釋消息的含義.

與HTTP不同,WebSocket是處在TCP上非常薄的一層,會將字節(jié)流轉(zhuǎn)化為文本/二進制消息,因此,對于實際應(yīng)用來說,WebSocket的通信形式層級過低,因此,可以在 WebSocket 之上使用STOMP協(xié)議哲戚,來為瀏覽器 和 server間的 通信增加適當(dāng)?shù)南⒄Z義奔滑。

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

1.HTTP協(xié)議解決了web瀏覽器發(fā)起請求以及web服務(wù)器響應(yīng)請求的細節(jié),假設(shè)HTTP協(xié)議不存在,只能使用TCP套接字來編寫web應(yīng)用,你可能認為這是一件瘋狂的事情;

2.直接使用WebSocket(SockJS)就很類似于使用TCP套接字來編寫web應(yīng)用,因為沒有高層協(xié)議,就需要我們定義應(yīng)用間發(fā)送消息的語義,還需要確保連接的兩端都能遵循這些語義;

3.同HTTP在TCP套接字上添加請求-響應(yīng)模型層一樣,STOMP在WebSocket之上提供了一個基于幀的線路格式層,用來定義消息語義

代碼實現(xiàn)

先安裝 sockjs-client 和 stompjs

npm install sockjs-client
npm install stompjs

如果單獨安裝npm install stompjs不成功,可以試試直接復(fù)制2行命令直接安裝.

// 引入 wensocket 模塊 監(jiān)聽數(shù)據(jù)變化
import SockJS from  'sockjs-client';
import  Stomp from 'stompjs';
export default {
    data(){
        return {
            stompClient:'',
            timer:'',
        }
    },
    methods:{
        initWebSocket() {
            this.connection();
            let that= this;
            // 斷開重連機制,嘗試發(fā)送消息,捕獲異常發(fā)生時重連
            this.timer = setInterval(() => {
                try {
                    that.stompClient.send("test");
                } catch (err) {
                    console.log("斷線了: " + err);
                    that.connection();
                }
            }, 5000);
        },  
        connection() {
            // 建立連接對象
           let socket = new SockJS('https://hkcx.io/cct/cct-websocket');
            // 獲取STOMP子協(xié)議的客戶端對象
            this.stompClient = Stomp.over(socket);
            // 定義客戶端的認證信息,按需求配置
            let headers = {
                Authorization:''
            }
            // 向服務(wù)器發(fā)起websocket連接
            this.stompClient.connect(headers,() => {
                this.stompClient.subscribe('/topic/public', (msg) => { // 訂閱服務(wù)端提供的某個topic
                    console.log('廣播成功')
                    console.log(msg);  // msg.body存放的是服務(wù)端發(fā)送給我們的信息
                     // 所要監(jiān)聽的數(shù)據(jù)函數(shù)
                     this.initUsdList();
                     this.initRange();
                },headers);
                this.stompClient.send("/app/chat.addUser",
                    headers,
                    JSON.stringify({sender: '',chatType: 'JOIN'}),
                )   //用戶加入接口
            }, (err) => {
                // 連接發(fā)生錯誤時的處理函數(shù)
                console.log('失敗')
                console.log(err);
            });
        },    //連接 后臺
        disconnect() {
            if (this.stompClient) {
                this.stompClient.disconnect();
            }
        },  // 斷開連接
    },
    mounted(){
        this.initWebSocket();
    },
    beforeDestroy: function () {
        // 頁面離開時斷開連接,清除定時器
        this.disconnect();
        clearInterval(this.timer);
    }
}

最為重要的兩點就是

 // 建立連接對象
      let socket = new SockJS('https://hkcx.io/cct/cct-websocket');
 this.stompClient.subscribe(
            '/topic/subscription',
            msg => {
              // 訂閱服務(wù)端提供的某個topic
              console.log('連接成功');
              console.log(msg); // msg.body存放的是服務(wù)端發(fā)送給我們的信息
              // 所要監(jiān)聽的數(shù)據(jù)函數(shù)
              this.initUsdList();
              this.initRange();
            },
            headers
          );
          this.stompClient.send(
            '/topic/subscription',
            headers,
            JSON.stringify({sender: '', chatType: 'JOIN'})
          ); //用戶加入接口
        },

這個鏈接口是需要后端提供給你通信接口!其次就是我們所要監(jiān)聽的函數(shù)寫入這里

 this.stompClient.subscribe(
            '/topic/subscription',
            msg => {
              // 訂閱服務(wù)端提供的某個topic
              console.log('連接成功');
              console.log(msg); // msg.body存放的是服務(wù)端發(fā)送給我們的信息
              // 所要監(jiān)聽的數(shù)據(jù)函數(shù)
              this.initUsdList();
              this.initRange();
            },
            headers
          );
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市顺少,隨后出現(xiàn)的幾起案子朋其,更是在濱河造成了極大的恐慌王浴,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件令宿,死亡現(xiàn)場離奇詭異叼耙,居然都是意外死亡,警方通過查閱死者的電腦和手機粒没,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門筛婉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人癞松,你說我怎么就攤上這事爽撒。” “怎么了响蓉?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵硕勿,是天一觀的道長。 經(jīng)常有香客問我枫甲,道長源武,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任想幻,我火速辦了婚禮粱栖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘脏毯。我一直安慰自己闹究,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布食店。 她就那樣靜靜地躺著渣淤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吉嫩。 梳的紋絲不亂的頭發(fā)上价认,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機與錄音自娩,去河邊找鬼刻伊。 笑死,一個胖子當(dāng)著我的面吹牛椒功,可吹牛的內(nèi)容都是我干的捶箱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼动漾,長吁一口氣:“原來是場噩夢啊……” “哼丁屎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起旱眯,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤晨川,失蹤者是張志新(化名)和其女友劉穎证九,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體共虑,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡愧怜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了妈拌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拥坛。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖尘分,靈堂內(nèi)的尸體忽然破棺而出猜惋,到底是詐尸還是另有隱情,我是刑警寧澤培愁,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布著摔,位于F島的核電站,受9級特大地震影響定续,放射性物質(zhì)發(fā)生泄漏谍咆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一私股、第九天 我趴在偏房一處隱蔽的房頂上張望摹察。 院中可真熱鬧,春花似錦庇茫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至寸宏,卻和暖如春宁炫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背氮凝。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工羔巢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人罩阵。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓竿秆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親稿壁。 傳聞我的和親對象是個殘疾皇子幽钢,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容