js實現(xiàn)WebSocket 連接的示例代碼
一.WebSocket 簡單介紹
1.HTTP和WebSocket的區(qū)別
http:通信只能由客戶端發(fā)起;
WebSocket:服務器可以主動向客戶端推送信息,客戶端也可以主動向服務器發(fā)送信息,是真正的雙向平等對話,屬于服務器推送技術(shù)的一種;在webSocket協(xié)議下客服端和瀏覽器可以同時發(fā)送信息。
2.WebSocket應用場景
數(shù)據(jù)推送:webSocket可以代替ajax輪詢(即客戶端通過一定的時間間隔不斷向服務器發(fā)起請求獲得數(shù)據(jù),因此會占用許多帶寬和服務器資源),但是webSocket不一樣,當建立TCP連接后,服務器可以主動給客戶端傳遞數(shù)據(jù),能夠更好的節(jié)省服務器資源和帶寬,實現(xiàn)更實時的數(shù)據(jù)通訊。
二.js使用WebSocket
Web Sockets能夠在客戶端和服務端之間發(fā)送非常少量的數(shù)據(jù),而不必擔心HTTP那樣字節(jié)級的開銷,由于傳遞的數(shù)據(jù)包很小,因此WebSockets非常適合移動應用。
缺點:制定協(xié)議的時間比制定JavaScript API的時間還要長。
1.創(chuàng)建WebSocket實例
url:url之前需添加ws://(未加密)或wss://(已加密),類似http://、https://
protocol:與服務端定義的協(xié)議名稱相同,協(xié)議的參數(shù)例如XMPP(Extensible Messaging and Presence Protocol)、SOAP(Simple Object Access Protocol)或者自定義協(xié)議。
var ws = new WebSocket('ws://url'); var ws1 = new WebSocket('ws://url', 'myprotocol'); var ws2 = new WebSocket('ws://url', ['protocol_1','protovol_2']));
2.屬性
①readyState屬性:WebSocket當前連接狀態(tài)
屬性值 | 屬性常量 | 描述 |
---|---|---|
0 | CONNECTING | 正在與服務端建立WebSocket連接,還沒有連接成功 |
1 | OPEN | 連接成功并打開,可以發(fā)送消息 |
2 | CLOSING | 進行關(guān)閉連接的操作,且尚未關(guān)閉 |
3 | CLOSE | 連接已關(guān)閉或不能打開 |
通過 ws.readyState屬性查看當前連接狀態(tài),例
alert('ws連接狀態(tài):' + ws.readyState);
②bufferedAmount:檢查傳輸數(shù)據(jù)的大小,當客戶端傳輸大量數(shù)據(jù)時使用避免網(wǎng)絡飽和
③protocol:在構(gòu)造函數(shù)中使用,protocol參數(shù)讓服務端知道客戶端使用的WebSocket協(xié)議。而WebSocket對象的這個屬性就是指的最終服務端確定下來的協(xié)議名稱,可以為空
3.方法
①發(fā)送數(shù)據(jù):send()
var message = { id: 1, title: '發(fā)送ws數(shù)據(jù)' } ws.send(JSON.stringify(message)); // 復雜的數(shù)據(jù)結(jié)構(gòu)要先進行序列化
②關(guān)閉連接:closed()
ws.close()
4.事件
WebSocket API是純事件驅(qū)動,建立連接之后,可自動發(fā)送狀態(tài)改變的數(shù)據(jù)和通知
事件 | 描述 |
---|---|
onopen | 當建立websocket連接時觸發(fā),只觸發(fā)一次 |
onerror | 當連接出現(xiàn)錯誤時觸發(fā)-因為當觸發(fā)了onerror之后連接就會觸發(fā)關(guān)閉事件 |
onmessage | 當服務端發(fā)送數(shù)據(jù)時觸發(fā),可多次觸發(fā),頁面數(shù)據(jù)展示處理模塊–實現(xiàn)輪詢 |
onclose | 當websocket連接關(guān)閉時觸發(fā),只觸發(fā)一次 |
5.使用示例
var ws = new WebSocket('ws://url'); // 獲取連接狀態(tài) console.log('ws連接狀態(tài):' + ws.readyState); //監(jiān)聽是否連接成功 ws.onopen = function () { console.log('ws連接狀態(tài):' + ws.readyState); //連接成功則發(fā)送一個數(shù)據(jù) ws.send('test1'); } // 接聽服務器發(fā)回的信息并處理展示 ws.onmessage = function (data) { console.log('接收到來自服務器的消息:'); console.log(data); //完成通信后關(guān)閉WebSocket連接 ws.close(); } // 監(jiān)聽連接關(guān)閉事件 ws.onclose = function () { // 監(jiān)聽整個過程中websocket的狀態(tài) console.log('ws連接狀態(tài):' + ws.readyState); } // 監(jiān)聽并處理error事件 ws.onerror = function (error) { console.log(error); }
到此這篇關(guān)于js實現(xiàn)WebSocket 連接的示例代碼的文章就介紹到這了,更多相關(guān)js WebSocket 連接內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
bootstrap中使用google prettify讓代碼高亮的方法
使用google prettify 讓代碼高亮非常漂亮,接下來通過本文給大家介紹bootstrap中使用google prettify讓代碼高亮的方法,感興趣的朋友一起看看吧2016-10-10基于slideout.js實現(xiàn)移動端側(cè)邊欄滑動特效
這篇文章主要為大家詳細介紹了基于slideout.js實現(xiàn)移動端側(cè)邊欄滑動特效,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11javascript實現(xiàn)狀態(tài)欄中文字動態(tài)顯示的方法
這篇文章主要介紹了javascript實現(xiàn)狀態(tài)欄中文字動態(tài)顯示的方法,涉及JavaScript基于時間函數(shù)動態(tài)操作頁面元素屬性的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-10-10Cropper.js進階之裁剪后保存至服務器實現(xiàn)詳解
這篇文章主要為大家介紹了Cropper.js進階之裁剪后保存至服務器實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05