js中的WebSocket使用及說明
一、WebSocket定義
html5提供的單個TCP連接上進行全雙工通信的協(xié)議。
WebSocket允許服務端主動向客戶端推送數據。
在WebSocket API中,瀏覽器和服務器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進行雙向數據傳輸。
二、WebSocket特點
在實現數據推送時,多數都是ajax輪詢(在特定的時間間隔,由瀏覽器主動發(fā)起請求,會占用很多帶寬和服務器資源)。
而WebSocket建立TCP連接后,服務器可以主動給客戶端傳遞數據,能夠更好的節(jié)省服務器資源和帶寬,實現更實時的數據通訊。
因為WebSockets只能通過連接發(fā)送純文本數據和二進制數據,所以對于復雜的數據結構,在通過連接發(fā)送之前,必須進行JSON.stringify()序列化。
協(xié)議標識符是ws(加密則為wss),服務器網址就是 URL。
如“ws://localhost:8080"。
三、WebSocket用法
WebSocket的所有操作都是采用事件的方式觸發(fā)的,這樣不會阻塞UI,使得UI有更快的響應時間和更好的用戶體驗。
瀏覽器通過Javascript向服務器發(fā)出建立WebSocket連接的請求,連接建立后,客戶端和服務器就可以通過TCP連接直接交換數據。
當獲取WebSocket連接后,可以通過send()方法向服務器發(fā)送數據,可以通過onmessage事件接收服務器返回的數據。
實例 | var ws = new WebSocket(path [,protocols]); path:要連接的 URL,這應該是 WebSocket 服務器將響應的 URL。 protocols(可選):一個協(xié)議字符串或者一個包含協(xié)議字符串的數組。 |
屬性 | ws.readyState ... |
方法 | ws.send() ws.close() |
事件 | ws.onopen ws.onmessage ws.close ws.onerror |
//創(chuàng)建一個webSocket實例,執(zhí)行后,客戶端就會與服務端連接 var ws = new WebSocket("ws://localhost:8080"); //當WebSocket創(chuàng)建成功時,觸發(fā)onopen事件 ws.onopen = function(){ console.log("open"); // 復雜的數據結構,在通過連接發(fā)送之前,必須進行序列化。 const json = JSON.stringify({ type: 'keepalive', id: '' }); ws.send(json); //將消息發(fā)送到服務端 } //當客戶端收到服務端發(fā)來的消息時,觸發(fā)onmessage事件 ws.onmessage = function(e){ //e.data 的數據格式也是字符串,手動解析這些數據才能得到其他格式的數據。 const _data = JSON.parse(e.data); console.log(e.data,_data); } //當客戶端收到服務端發(fā)送的關閉連接請求時,觸發(fā)onclose事件 ws.onclose = function(e){ console.log("close"); } //如果出現連接、處理、接收、發(fā)送數據失敗的時候觸發(fā)onerror事件 ws.onerror = function(e){ console.log(error); }
四、Http與WebSocket的區(qū)別
http協(xié)議是短鏈接,因為請求之后,都會關閉連接,下次重新請求數據,需要再次打開連接。
WebSocket協(xié)議是一種長連接,只需要通過一次請求來初始化鏈接,然后所有的請求和響應都是通過這個TCP鏈接進行通信。
五、WebSocket和Socket的區(qū)別
Socket是應用層與TCP/IP協(xié)議通信的中間軟件抽象層,它是一組接口。
而WebSocket則不同,它是一個完整的應用層協(xié)議,包含一套標準的API。
六、利用socket.io實現簡易聊天室思路
- 客戶端通過發(fā)送io.connect(url)連接請求與服務器端進行連接(若不適用socket.io庫,使用new WebSocket(url)可以發(fā)送連接請求);
- 服務器端通過監(jiān)聽‘connection’事件處理連接請求io.on(‘connection’,function(socket){//發(fā)送open事件});
- 客戶端通過監(jiān)聽open事件確認是否與服務器端進行連接;
- 客戶端通過send方法向服務器端發(fā)送信息;
- 服務器端通過監(jiān)聽message方法監(jiān)聽send的發(fā)送信息,并處理發(fā)送信息(將信息廣播給其他聊天室成員和自己);
- 服務器端通過監(jiān)聽disconnect方法判斷客戶端請求是否斷開;
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
讓GoogleCode的SVN下的HTML文件在FireFox下正常顯示.
GoogleCode可以作為免費的穩(wěn)定的靜態(tài)資源空間來使用,比如JQuery的文檔就在上面2009-05-05Jquery作者John Resig自己封裝的javascript 常用函數
Jquery作者John Resig自己封裝的常用函數, 大家可以參考下。2009-11-11javascript:window.open彈出窗口的位置問題
這篇文章主要介紹了javascript:window.open彈出窗口的位置問題,需要的朋友可以參考下2014-03-03