JavaScript Web Socket 詳解

Web Socket

? Web Socket(套接字)的目標是通過一個長時連接實現與服務器全雙工、雙向的通信。在 JavaScript 中創建 Web Socket 時,一個 HTTP 請求會發送到服務器以初始化連接。服務器響應后,連接使用 HTTP 的 Upgrade 頭部從 HTTP 協議切換到 Web Socket 協議。這意味著 Web Socket 不能通過標準 HTTP 服務器實現,而必須使用支持該協議的專有服務器。

? 因為 Web Socket 使用了自定義協議,所以 URL方案(scheme)稍有變化:不能再使用 http://或 https://, 而要使用 ws://和 wss://。前者是不安全的連接,后者是安全連接。在指定 Web Socket URL 時,必須包含 URL 方案,因為將來有可能再支持其他方案。

? 使用自定義協議而非 HTTP 協議的好處是,客戶端與服務器之間可以發送非常少的數據,不會對 HTTP 造成任何負擔。使用更小的數據包讓 Web Socket 非常適合帶寬和延遲問題比較明顯的移動應用。 使用自定義協議的缺點是,定義協議的時間比定義 JavaScript API 要長。Web Socket 得到了所有主流瀏覽器支持。

? Web Socket 是與服務器的全雙工、雙向通信渠道。與其他方案不同,Web Socket 不使用 HTTP,而使用了自定義協議,目的是更快地發送小數據塊。這需要專用的服務器,但速度優勢明顯。

API

? 要創建一個新的 Web Socket,就要實例化一個 WebSocket 對象并傳入提供連接的 URL

let socket = new WebSocket("ws://www.example.com/server.php"); 

? 注意,必須給 WebSocket 構造函數傳入一個絕對 URL同源策略不適用于 Web Socket,因此可以打開到任意站點的連接。至于是否與來自特定源的頁面通信,則完全取決于服務器。(在握手階段就可以確定請求來自哪里。)

? 瀏覽器會在初始化 WebSocket 對象之后立即創建連接。與 XHR 類似,WebSocket 也有一個 readyState 屬性表示當前狀態。不過,這個值與 XHR 中相應的值不一樣。

  • WebSocket.OPENING(0):連接正在建立。
  • WebSocket.OPEN(1):連接已經建立。
  • WebSocket.CLOSING(2):連接正在關閉。
  • WebSocket.CLOSE(3):連接已經關閉。

? WebSocket 對象沒有 readystatechange 事件,而是有與上述不同狀態對應的其他事件。 readyState 值從 0 開始。

? 任何時候都可以調用 close() 方法關閉 Web Socket 連接:

socket.close();  

? 調用 close() 之后,readyState 立即變為 2(連接正在關閉),并會在關閉后變為 3(連接已經關閉)。

發送和接收數據

? 打開 Web Socket 之后,可以通過連接發送和接收數據。要向服務器發送數據,使用 send() 方法并傳入一個字符串、ArrayBuffer 或 Blob,如下所示:

let socket = new WebSocket("ws://www.example.com/server.php"); let stringData = "Hello world!"; 
let arrayBufferData = Uint8Array.from(['f', 'o', 'o']); 
let blobData = new Blob(['f', 'o', 'o']); socket.send(stringData); 
socket.send(arrayBufferData.buffer); 
socket.send(blobData); 

? 服務器向客戶端發送消息時,WebSocket 對象上會觸發 message 事件。這個 message 事件與其他消息協議類似,可以通過 event.data 屬性訪問到有效載荷:

socket.onmessage = function(event) { let data = event.data; // 對數據執行某些操作
};

? 與通過 send() 方法發送的數據類似,event.data 返回的數據也可能是 ArrayBuffer 或 Blob。 這由 WebSocket 對象的 binaryType 屬性決定,該屬性可能是"blob"或"arraybuffer"。

其他事件

? WebSocket 對象在連接生命周期中有可能觸發 3 個其他事件。

  • open:在連接成功建立時觸發。
  • error:在發生錯誤時觸發。連接無法存續。
  • close:在連接關閉時觸發。

? WebSocket 對象不支持 DOM Level 2 事件監聽器,因此需要使用 DOM Level 0 風格的事件處理程序來監聽這些事件:

let socket = new WebSocket("ws://www.example.com/server.php"); 
socket.onopen = function() { alert("Connection established."); 
}; 
socket.onerror = function() { alert("Connection error."); 
}; 
socket.onclose = function() { alert("Connection closed."); 
}; 

? 在這些事件中,只有 close 事件的 event 對象上有額外信息。這個對象上有 3 個額外屬性: wasClean、code 和 reason。

  • wasClean 是一個布爾值,表示連接是否干凈地關閉;
  • code 是一個來自服務器的數值狀態碼;
  • reason 是一個字符串,包含服務器發來的消息。可以將這些信息顯示給用戶或記錄到日志:
socket.onclose = function(event) { console.log(`as clean? ${event.wasClean} Code=${event.code} Reason=${event.reason}`); 
};

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713705.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713705.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713705.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

12、窗口看門狗

目錄 1、窗口看門狗概述 2、常用寄存器和庫函數配置 3、窗口看門狗實驗 1、窗口看門狗概述 之所以稱為窗口就是因為其喂狗時間是一個有上下限的范圍內(窗口),你可以通過設定相關寄存器,設定其上限時間(下限固定&…

數據結構 棧和隊列 力扣例題AC——代碼以及思路記錄

20. 有效的括號 給定一個只包括 (,),{,},[,] 的字符串 s ,判斷字符串是否有效。 有效字符串需滿足: 左括號必須用相同類型的右括號閉合。左括號必須以正確的順序閉合。每個右括號都有一個對應…

mysql使用連接池

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 前言一、mysql連接池?二、使用步驟1.引入庫 前言 提示:這里可以添加本文要記錄的大概內容: 例如: 提示&#xff1a…

深入理解Flutter中的StreamSubscription和StreamController

在Flutter中,StreamSubscription和StreamController是處理異步數據流的重要工具。它們提供了一種方便的方式來處理來自異步事件源的數據。本文將深入探討它們的區別以及在實際應用中的使用場景。 StreamSubscription StreamSubscription代表了對數據流的訂閱&…

代碼隨想錄算法訓練營番外 刷題日記0301 || 29、兩數相除,31、下一個排列

29、兩數相除 思路:不斷相減就是求解的最直接方法,我這樣計算時間復雜度有點高 // 時間復雜度O(count*divisor) // 空間復雜度O(1)class Solution {int res 0;public int divide(int dividend, int divisor) {// dividend 是被除數if(dividend 0) …

技術棧選型的時候,ruby、go、java、vue、react應該怎么選擇?

選擇適合項目需求、團隊技術背景和偏好、開發速度、性能要求以及可擴展性的技術棧和框架是一個綜合考慮的過程,沒有一種通用的最佳選擇,取決于具體情況。 選擇Vue.js或React應該綜合考慮項目的需求、團隊的技術背景和偏好、生態系統的支持和發展趨勢等因…

隨記-點選驗證碼

文字驗證碼(點擊文字) 模板匹配(從一張圖片中尋找 icon),放棄,目前準確率不高,且處理過程復雜 灰度處理將 complete_image_path 截取并另存為 target_image_path, verify_image_path…

WPF真入門教程30--順風物流單據管理系統

1、教程回顧 到現在為止,真入門系列教程已完成了29刺由淺入深地講解,當然不可能講到了WPF的所有技能點,但讀者看到了wpf的內部各種功能及之間的聯系,在此基礎上,提供一個完整有效的綜合項目,本項目采用的是…

c++知識點之 --this

在成員函數中存在。struct和class每個成員函數都隱含一個名為this的指針形參,并且它是該成員函數的第一個參數,當某個對象調用成員函數時,就會把該對象的地址傳給被調用成員函數的隱式形參this。 this是一個指針 ,存放的是當前對象…

加密與安全_深入了解Hmac算法(消息認證碼)

文章目錄 PreHMAC概述常見的Hmac算法Code隨機的key的生成 KeyGeneratorHmacMD5用Hmac算法取代原有的自定義的加鹽算法 HmacMD5 VS MD5HmacSHA256 Pre 加密與安全_深入了解哈希算法中我們提到, 存儲用戶的哈希口令時,要加鹽存儲,目的就在于抵…

操作系統系列學習——CPU管理的直觀想法

文章目錄 前言CPU管理的直觀想法 前言 一個本碩雙非的小菜雞,備戰24年秋招,計劃學習操作系統并完成6.0S81,加油! 本文總結自B站【哈工大】操作系統 李治軍(全32講) 老師課程講的非常好,感謝 【…

OpenLayers線性漸變和中心漸變(徑向漸變)

目錄 1.前言2.添加一個面要素3.線性漸變3.1 第一個注意點3.2 第二個注意點 4.中心漸變(徑向漸變)5.總結 1.前言 OpenLayers官網有整個圖層的漸變示例,但是沒有單個要素的漸變示例,我們這里來補充一下。OpenLayers中的漸變是通過fi…

python defaultdict

python中的dict是一個重要的數據類型,知道如何使用這個數據類型很簡單,但是這個類型使用過程中容易進入一些誤區,這篇文章主要對defaultdict方法的講解,深入的了解dict數據類型。 字典(dictionary)數據類型…

編譯鏈接實戰(22)C/C++代碼覆蓋率統計報告生成

文章目錄 GCOV 工具簡介gcov 使用lcov相關編譯選項 GCOV 工具簡介 gcov是一個測試代碼覆蓋率的工具,它是 gcc 自帶的查看代碼覆蓋率的工具。 與GCC結合使用,可以分析您的程序以幫助創建更高效、運行更快的代碼,并發現程序中未經測試的部分。…

PCIE 4.0 L0s/L1/L2

L0是PCIE設備正常工作的狀態,當設備鏈路處于非工作狀態可以跳轉大相應的低功耗狀態,L0s是一種可以快速恢復到L0的低功耗狀態;L1必須經過Reovery狀態才可以恢復到L0狀態;L2需要從Detect開始逐步進入到L0狀態。它們的恢復時間依次延…

麒麟銀河操作系統V10部署ffmpeg(也能用于Linux系統)

麒麟銀河操作系統V10部署ffmpeg(也能用于Linux系統) 部署ffmpeg用來處理視頻的各種操作 想使用ffmpeg,要先安裝nasm,yasm,x264之后,否則會報錯 nkvers 查看麒麟操作系統版本 cat /proc/version #查看linux版本信息 uname -a …

Android修行手冊-Chaquopy中opencv、numpy的初步應用

Unity3D特效百例案例項目實戰源碼Android-Unity實戰問題匯總游戲腳本-輔助自動化Android控件全解手冊再戰Android系列Scratch編程案例軟考全系列Unity3D學習專欄藍橋系列ChatGPT和AIGC 👉關于作者 專注于Android/Unity和各種游戲開發技巧,以及各種資源分…

SpringBoot源碼解讀與原理分析(三十八)SpringBoot整合WebFlux(一)WebFlux的自動裝配

文章目錄 前言第13章 SpringBoot整合WebFlux13.1 響應式編程與Reactor13.1.1 命令式與響應式13.1.2 異步非阻塞13.1.3 觀察者模式13.1.4 響應性13.1.5 響應式流13.1.6 背壓13.1.7 Reactor13.1.7.1 Publisher13.1.7.2 Subscriber13.1.7.3 Subscription13.1.7.4 Processor13.1.7.…

BF算法實現(Python,C++)

BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是將目標串S的第一個字符與模式串T的第一個字符進行匹配,若相等,則繼續比較S的第二個字符和 T的第二個字符;若不相等,則比…

Leetcoder Day32| 貪心算法part05

763.劃分字母區間 字符串 S 由小寫字母組成。我們要把這個字符串劃分為盡可能多的片段,同一字母最多出現在一個片段中。返回一個表示每個字符串片段的長度的列表。 示例: 輸入:S "ababcbacadefegdehijhklij"輸出:[9,7…