亚洲乱色熟女一区二区三区丝袜,天堂√中文最新版在线,亚洲精品乱码久久久久久蜜桃图片,香蕉久久久久久av成人,欧美丰满熟妇bbb久久久

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

【JavaScript】十分鐘學(xué)會(huì)http中用純JS操作WebSocket

admin
2024年4月28日 14:7 本文熱度 2049

WebSocket簡介

WebSocket是一種在客戶端和服務(wù)器之間實(shí)現(xiàn)雙向通信的網(wǎng)絡(luò)協(xié)議。它通過在單個(gè)TCP連接上提供全雙工通信功能,使得服務(wù)器可以主動(dòng)向客戶端推送數(shù)據(jù),而不需要客戶端發(fā)起請(qǐng)求。

WebSocket與HTTP的區(qū)別

與傳統(tǒng)的HTTP協(xié)議相比,WebSocket具有以下幾個(gè)顯著的區(qū)別:

  • 雙向通信:WebSocket支持客戶端和服務(wù)器之間的實(shí)時(shí)雙向通信,而HTTP協(xié)議是單向請(qǐng)求-響應(yīng)模式。
  • 低延遲:由于WebSocket使用長連接,避免了HTTP的連接建立和斷開過程,可以降低通信延遲。
  • 更少的數(shù)據(jù)傳輸:WebSocket頭部信息相對(duì)較小,減少了數(shù)據(jù)傳輸?shù)拈_銷。
  • 跨域支持:WebSocket可以輕松跨域,而HTTP需要通過CORS等機(jī)制來實(shí)現(xiàn)。

WebSocket的工作原理

WebSocket的握手過程和HTTP有所不同??蛻舳送ㄟ^發(fā)送特定的HTTP請(qǐng)求進(jìn)行握手,服務(wù)器收到請(qǐng)求后進(jìn)行驗(yàn)證,如果驗(yàn)證通過,則會(huì)建立WebSocket連接。

建立連接后,客戶端和服務(wù)器之間可以通過WebSocket發(fā)送和接收消息,可以使用文本、二進(jìn)制數(shù)據(jù)等進(jìn)行通信。

WebSocket的應(yīng)用場景

WebSocket的實(shí)時(shí)雙向通信特性使得它在許多應(yīng)用場景中發(fā)揮重要作用,例如:

  • 即時(shí)聊天:WebSocket可以實(shí)現(xiàn)實(shí)時(shí)的聊天功能,用戶可以發(fā)送和接收消息,實(shí)現(xiàn)快速、低延遲的聊天體驗(yàn)。
  • 實(shí)時(shí)數(shù)據(jù)更新:對(duì)于需要實(shí)時(shí)更新數(shù)據(jù)的應(yīng)用,如股票行情、實(shí)時(shí)監(jiān)控等,WebSocket可以將數(shù)據(jù)實(shí)時(shí)推送給客戶端,確保數(shù)據(jù)的及時(shí)更新。
  • 在線游戲:在線游戲需要實(shí)時(shí)的雙向通信,WebSocket可以提供穩(wěn)定的通信通道,支持實(shí)時(shí)交互和多人游戲。

WebSocket的使用

以下是使用JavaScript與WebSocket建立連接的示例代碼:

var Socket = new WebSocket("url, [protocol]");

以上代碼中的第一個(gè)參數(shù)url, 指定連接的 URL。第二個(gè)參數(shù)protocol是可選的,指定了可接受的子協(xié)議。

WebSocket 屬性

以下是 WebSocket 對(duì)象的屬性。

屬性描述
Socket.readyState只讀屬性readyState表示連接狀態(tài),可以是以下值:0-表示連接尚未建立。1-表示連接已建立,可以進(jìn)行通信。2-表示連接正在進(jìn)行關(guān)閉。3-表示連接已經(jīng)關(guān)閉或者連接不能打開。
Socket.bufferedAmount只讀屬性bufferedAmount已被send()放入正在隊(duì)列中等待傳輸,但是還沒有發(fā)出的UTF-8文本字節(jié)數(shù)。

  • 0-表示連接尚未建立。
  • 1-表示連接已建立,可以進(jìn)行通信。
  • 2-表示連接正在進(jìn)行關(guān)閉。
  • 3-表示連接已經(jīng)關(guān)閉或者連接不能打開。

WebSocket 事件

以下是 WebSocket 對(duì)象的相關(guān)事件。

事件事件處理程序描述
openSocket.onopen連接建立時(shí)觸發(fā)
messageSocket.onmessage客戶端接收服務(wù)端數(shù)據(jù)時(shí)觸發(fā)
errorSocket.onerror通信發(fā)生錯(cuò)誤時(shí)觸發(fā)
closeSocket.onclose連接關(guān)閉時(shí)觸發(fā)

  • 下面是相關(guān)示例代碼:
Socket.onopen = function() { 
   //連接建立時(shí)觸發(fā)
   console.log("WebSocket連接已建立");
};

Socket.onmessage = function(event) {
   //客戶端接收服務(wù)端數(shù)據(jù)時(shí)觸發(fā)
   var message = event.data;
   console.log("收到消息:" + message);
};

Socket.onerror = function() {
   //通信發(fā)生錯(cuò)誤時(shí)觸發(fā)
   console.log("WebSocket連接發(fā)生了錯(cuò)誤");
};

Socket.onclose = function() {
   //連接關(guān)閉時(shí)觸發(fā)
   console.log("WebSocket連接已關(guān)閉");
};

WebSocket 方法

以下是 WebSocket 對(duì)象的相關(guān)方法。

方法描述
Socket.send()使用連接發(fā)送數(shù)據(jù)
Socket.close()關(guān)閉連接

//發(fā)送一條消息
Socket.send('你好')
//關(guān)閉WebSocket連接
Socket.close()

WebSocket 除了發(fā)送和接收文本消息外,還支持發(fā)送和接收二進(jìn)制數(shù)據(jù)。對(duì)于發(fā)送二進(jìn)制數(shù)據(jù),可以使用 send() 方法傳遞一個(gè) ArrayBuffer 或 Blob 對(duì)象,例如:

const buffer = newArrayBuffer(4);
const view = newDataView(buffer);
view.setUint32(0, 1234);
socket.send(buffer);

在接收二進(jìn)制數(shù)據(jù)時(shí),可以通過 event.data 獲取到 ArrayBuffer 對(duì)象,然后進(jìn)行處理。

WebSocket的心跳機(jī)制

WebSocket的心跳機(jī)制是一種用于保持WebSocket連接的穩(wěn)定性和活躍性的方法。心跳機(jī)制的目的是定期發(fā)送小的探測(cè)消息,以確保連接仍然有效,如果連接斷開或出現(xiàn)問題,可以及時(shí)發(fā)現(xiàn)并采取措施。

下面是WebSocket心跳機(jī)制的詳細(xì)步驟和相關(guān)代碼示例:

定義心跳間隔:為了定期發(fā)送心跳消息,你需要定義一個(gè)心跳間隔,通常以毫秒為單位。在示例中,我們將心跳間隔設(shè)置為30秒。

const heartbeatInterval = 30000; // 30秒

定義心跳消息:你需要定義用于發(fā)送心跳的消息內(nèi)容。這通常是一個(gè)簡單的字符串,如"heartbeat",但可以根據(jù)應(yīng)用的需求自定義。

const heartbeatMessage = 'heartbeat';

設(shè)置心跳定時(shí)器:一旦WebSocket連接打開,你可以使用setInterval函數(shù)設(shè)置一個(gè)定時(shí)器,以便每隔一段時(shí)間發(fā)送心跳消息。

let heartbeat;

socket.addEventListener('open', () => {
   console.log('WebSocket連接已打開');

   heartbeat = setInterval(() => {
       socket.send(heartbeatMessage);
   }, heartbeatInterval);
});

處理心跳消息:當(dāng)你接收到來自服務(wù)器的消息時(shí),你需要檢查它是否是心跳消息。這可以通過比較接收到的消息內(nèi)容和心跳消息的內(nèi)容來實(shí)現(xiàn)。

socket.addEventListener('message', (event) => {
   const message = event.data;

   if (message === heartbeatMessage) {
       console.log('接收到心跳消息');
       // 在這里可以執(zhí)行一些處理心跳消息的操作
   } else {
       console.log('接收到其他消息:', message);
       // 處理其他類型的消息
   }
});

清除心跳定時(shí)器:當(dāng)WebSocket連接關(guān)閉時(shí),你應(yīng)該清除之前設(shè)置的心跳定時(shí)器,以防止繼續(xù)發(fā)送心跳消息。

socket.addEventListener('close', () => {
   console.log('WebSocket連接已關(guān)閉');

   clearInterval(heartbeat);
});

通過這些步驟,你可以實(shí)現(xiàn)WebSocket的心跳機(jī)制,確保連接的持續(xù)穩(wěn)定,以適應(yīng)長時(shí)間的通信需求。如果連接斷開或出現(xiàn)問題,你可以根據(jù)需要添加進(jìn)一步的錯(cuò)誤處理機(jī)制。

WebSocket 的安全性和跨域問題如何處理?

WebSocket 支持通過 wss:// 前綴建立加密的安全連接,使用 TLS/SSL 加密通信,確保數(shù)據(jù)的安全性。在使用加密連接時(shí),服務(wù)器需要配置相應(yīng)的證書。

對(duì)于跨域問題,WebSocket 遵循同源策略,只能與同源的服務(wù)器建立連接。如果需要與不同域的服務(wù)器通信,可以使用 CORS(跨域資源共享)來進(jìn)行跨域訪問控制。

有哪些好用的客戶端WebSocket第三方庫

  1. Socket.io-clientSocket.io[1] 是一個(gè)流行的實(shí)時(shí)通信庫,它提供了客戶端 JavaScript 庫,可用于在瀏覽器中與 Socket.io[2] 服務(wù)器建立 WebSocket 連接。它支持自動(dòng)重連、事件處理等功能,用于構(gòu)建實(shí)時(shí)應(yīng)用非常方便。
  2. ReconnectingWebSocket:ReconnectingWebSocket 是一個(gè)帶有自動(dòng)重連功能的 WebSocket 客戶端庫,可以很好地處理網(wǎng)絡(luò)連接斷開和重新連接的情況,適合用于瀏覽器端的 WebSocket 開發(fā)。
  3. SockJS-client:SockJS 提供了一個(gè)瀏覽器端的 JavaScript 客戶端庫,用于與 SockJS 服務(wù)器建立連接。它可以在不支持 WebSocket 的瀏覽器上自動(dòng)降級(jí)到其他傳輸方式,具有良好的兼容性。
  4. RxJS WebSocketSubject:RxJS 是一個(gè)流式編程庫,它提供了 WebSocketSubject 類,可以將 WebSocket 轉(zhuǎn)換為可觀察對(duì)象,方便進(jìn)行響應(yīng)式編程。
  5. autobahn.js:autobahn.js 是一個(gè)用于實(shí)現(xiàn) WebSocket 和 WAMP(Web Application Messaging Protocol)的客戶端庫,在瀏覽器中可以方便地使用它來與 WAMP 路由進(jìn)行通信。

這些庫都提供了良好的接口封裝和功能特性,可以根據(jù)項(xiàng)目需求選擇適合的庫來進(jìn)行瀏覽器端的 WebSocket 開發(fā)。

總結(jié)

WebSocket 協(xié)議是一種基于 TCP 的應(yīng)用層協(xié)議,它提供了在客戶端和服務(wù)器之間進(jìn)行雙向通信的能力。相比傳統(tǒng)的 HTTP 協(xié)議,它具有更低的延遲和更高的實(shí)時(shí)性。

WebSocket 協(xié)議通過建立一條持久化的連接來實(shí)現(xiàn)雙向通信,從而避免了 HTTP 協(xié)議中頻繁建立和斷開連接的過程,減少了網(wǎng)絡(luò)開銷和服務(wù)器的負(fù)擔(dān)??蛻舳丝梢园l(fā)送消息給服務(wù)器,服務(wù)器也可以發(fā)送消息給客戶端,實(shí)現(xiàn)了真正的雙向通信。

在使用 WebSocket 協(xié)議時(shí),客戶端和服務(wù)器會(huì)進(jìn)行一次握手過程,以建立起 WebSocket 連接。握手過程中,客戶端會(huì)發(fā)送一個(gè) HTTP 請(qǐng)求,請(qǐng)求頭中包含 Upgrade 和 Connection 字段,告訴服務(wù)器它希望升級(jí)到 WebSocket 連接。服務(wù)器收到請(qǐng)求后會(huì)返回一個(gè) HTTP 響應(yīng),響應(yīng)頭中包含 Upgrade 和 Connection 字段,以及一個(gè) Sec-WebSocket-Accept 字段,用于驗(yàn)證請(qǐng)求的合法性。握手成功后,客戶端和服務(wù)器就可以開始使用 WebSocket 協(xié)議進(jìn)行通信了。

WebSocket 協(xié)議支持二進(jìn)制數(shù)據(jù)和文本數(shù)據(jù)的傳輸,開發(fā)者可以根據(jù)實(shí)際需求進(jìn)行選擇。同時(shí),WebSocket 還提供了心跳機(jī)制、自動(dòng)重連等功能,可以提高連接的穩(wěn)定性和可靠性。

總之,WebSocket 協(xié)議在實(shí)時(shí)通信、游戲、在線聊天等場景中得到了廣泛應(yīng)用,它為 Web 應(yīng)用提供了更加高效、可靠的雙向通信方式。

參考資料

[1]

https://cloud.tencent.com/developer/tools/blog-entry?target=https%3A%2F%2Flink.juejin.cn%2F%3Ftarget%3Dhttp%253A%252F%252Fsocket.io%252F&source=article&objectId=2371055: https://cloud.tencent.com/developer/tools/blog-entry?target=https%3A%2F%2Flink.juejin.cn%2F%3Ftarget%3Dhttp%253A%252F%252Fsocket.io%252F&source=article&objectId=2371055

[2]

https://cloud.tencent.com/developer/tools/blog-entry?target=https%3A%2F%2Flink.juejin.cn%2F%3Ftarget%3Dhttp%253A%252F%252Fsocket.io%252F&source=article&objectId=2371055: https://cloud.tencent.com/developer/tools/blog-entry?target=https%3A%2F%2Flink.juejin.cn%2F%3Ftarget%3Dhttp%253A%252F%252Fsocket.io%252F&source=article&objectId=2371055



該文章在 2024/4/28 20:58:38 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲(chǔ)管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved