WebSocket 是什麼原理?為什麼可以實現持久連接?

来源:https://www.cnblogs.com/hanbing81868164/archive/2023/11/30/17866339.html
-Advertisement-
Play Games

WebSocket 是一種用於實現持久連接的通信協議,它的原理和工作方式相對複雜,但我們可以嘗試以儘可能簡單和清晰的方式來解釋它。 WebSocket 的原理 在理解 WebSocket 的工作原理之前,我們首先要瞭解 HTTP 協議的短連接性質。在傳統的 HTTP 通信中,客戶端發送一個請求到服務 ...


WebSocket 是一種用於實現持久連接的通信協議,它的原理和工作方式相對複雜,但我們可以嘗試以儘可能簡單和清晰的方式來解釋它。

WebSocket 的原理

在理解 WebSocket 的工作原理之前,我們首先要瞭解 HTTP 協議的短連接性質。在傳統的 HTTP 通信中,客戶端發送一個請求到伺服器,伺服器響應後就關閉連接,這導致了每個請求都需要建立和關閉連接,而這些連接的建立和關閉會消耗網路資源和時間。

WebSocket 的原理是在 HTTP 協議上建立一種全雙工的通信方式,使得客戶端和伺服器之間可以建立一次連接,然後保持這個連接的開放狀態,而不需要在每次通信後關閉連接。這種持久連接使得伺服器可以主動向客戶端推送數據,而不需要等待客戶端的請求。

WebSocket 的工作過程

下麵是 WebSocket 的工作過程,包括握手階段和通信階段:

握手階段

a. 客戶端發起一個 HTTP 請求,請求升級到 WebSocket 協議。這個請求包含了一些特殊的頭信息,表明客戶端希望建立 WebSocket 連接。

b. 伺服器收到這個請求後,會進行升級協議的操作,如果支持 WebSocket,它將回覆一個 HTTP 101 狀態碼,表示成功升級到 WebSocket 協議。

c. 一旦協議升級完成,客戶端和伺服器之間的連接就變成了全雙工,保持開放狀態,可以雙向通信。

通信階段

a. 客戶端和伺服器可以互相發送消息,這些消息都是以幀(frames)的形式進行傳輸,而不是傳統的 HTTP 請求和響應。

b. 伺服器可以主動向客戶端推送消息,而客戶端也可以主動向伺服器發送消息。這種雙向通信在實時性要求高的應用中非常有用,比如線上聊天、股票市場數據推送等。

關閉連接

a. 當雙方中的一方決定關閉連接時,它會發送一個關閉幀,通知另一方關閉連接。

b. 另一方收到關閉幀後,也會回覆一個關閉幀,然後雙方都關閉連接。

為什麼 WebSocket 可以實現持久連接?

WebSocket 可以實現持久連接的原因有以下幾點:

協議支持:WebSocket 是一種專門設計用於實現持久連接的協議,與傳統的 HTTP 不同。HTTP 是一種請求-響應協議,每次請求後都會關閉連接。WebSocket 則建立在一次握手之後,保持連接開放狀態,允許雙向通信。

資源節約:傳統的 HTTP 建立和關閉連接會消耗網路資源和時間。WebSocket 的持久連接避免了這種開銷,因此更適用於實時通信的場景。

實時性:在某些應用中,特別是需要實時性的應用,WebSocket 的持久連接允許伺服器主動向客戶端推送數據,而不需要等待客戶端的請求。這對於線上聊天、實時游戲、股票市場數據等應用非常重要。

WebSocket 的示例代碼

下麵是一個簡單的 WebSocket 示例,使用 Node.js 來創建一個 WebSocket 伺服器和一個 WebSocket 客戶端:

WebSocket 伺服器示例(Node.js)

const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', (ws) => {
  console.log('Client connected');

  ws.on('message', (message) => {
    console.log(`Received: ${message}`);
    ws.send(`You sent: ${message}`);
  });

  ws.on('close', () => {
    console.log('Client disconnected');
  });
});

WebSocket 客戶端示例(Node.js)

const WebSocket = require('ws');

const ws = new WebSocket('ws://localhost:8080');

ws.on('open', () => {
  console.log('Connected to server');
  ws.send('Hello, server!');
});

ws.on('message', (message) => {
  console.log(`Received from server: ${message}`);
});

ws.on('close', () => {
  console.log('Disconnected from server');
});

在這個示例中,伺服器和客戶端都使用了 Node.js 的 ws 模塊來創建 WebSocket 連接。伺服器監聽在埠 8080 上,當客戶端連接時,會在伺服器端和客戶端之間建立雙向通信。伺服器接收來自客戶端的消息,然後將消息返回給客戶端。

這個示例展示了 WebSocket 的簡單用法,但它可以用作更複雜的實時通信應用的基礎。WebSocket 的持久連接特性使其成為實時性要求高的應用的理想選擇,如線上聊天、實時游戲、數據監控等。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一. C#使用場景介紹 C#是微軟公司發佈的一種由C和C++衍生出來的面向對象的編程語言、運行於.NET Framework和.NET Core(完全開源,跨平臺)之上的高級程式設計語言。 二. 開發流程 1. 創建項目:打開Visual Studio後右側選擇“創建新項目”,然後選擇“C# Win ...
  • 1、系統用戶管理 用戶的分類(用戶的ID): UID:用戶的身份標識符,每個用戶都會被分配一個獨特的ID 系統用戶(服務用戶):0 ~ 999 之間 普通用戶:1000 ~ 6000之間 用戶名和UID信息通常存儲在/etc/passwd文件中 用戶的存在是為了能更好的控制系統許可權 1 root:x ...
  • 在Linux或Unix下,如果你看見別人使用kill %1 或者kill %n (n為一個具體的數字)命令,你知道kill %n 這種帶%號的用法是幹嘛嗎?其實kill %n 表示kill掉後臺程式(也可以說是作業),其中n表示Job的編號(number),而不是進程的進程號,下麵我們來簡單演示一下 ...
  • 硬體:一個樹莓派4B、一臺筆記本電腦(以win10系統為例,做樹莓派顯示屏) 1 下載工具軟體 1.1 下載樹莓派鏡像燒錄器Raspberry Pi Imager。 該軟體是把Raspberry Pi OS安裝(燒錄)到TD卡上的工具。 樹莓派官網鏈接。根據下載Raspberry Pi Imager ...
  • 飛騰E2000板載乙太網適配e20005.4.18macbyt85211. 設備樹移植2. MACB驅動移植3. 網路連通性調試3-1. MACB驅動環回測試3-2. YT8521 PHY工作模式及電壓確認3-3. YT8521 PHY環回測試3-4. YT8521 PHY tx delay調整 飛 ...
  • 只是記錄一些我認為比較有用而且容易忘記的操作,主要系統為CentOS CentOS yum使用鏡像源 sudo yum install epel-release (虛擬機)使用主機代理 使用ip route show查看預設路由埠 設置代理: #添加Proxy代理信息(其中username和pas ...
  • SQL HAVING子句 HAVING子句被添加到SQL中,因為WHERE關鍵字不能與聚合函數一起使用。 HAVING語法 SELECT column_name(s) FROM table_name WHERE condition GROUP BY column_name(s) HAVING con ...
  • 稀疏索引 密集索引:文件中的每個搜索碼值都對應一個索引值,就是葉子節點保存了整行. 稀疏索引:文件只為索引碼的某些值建立索引項. 稀疏索引的創建過程包括將集合中的元素分段,並給每個分段中的最小元素創建索引。在搜索時,先定位到第一個大於搜索值的索引的前一個索引,然後從該索引所在的分段中從前向後順序遍歷 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...