【網絡協議】WebSocket講解

目錄

webSocket簡介

連接原理解析:

客戶端API

服務端API(java)

實戰案例

(1)引入依賴

(2)編寫服務端邏輯

(3)注冊配置類

?(4)前端連接 WebSocket 示例

Websocket與其他消息推送對比

總結


????????大家好,我是jstart千語。相信大家或多或少都聽說過webSocket,與http協議都是TCP下的一種通信協議。主要用于客戶端和服務端可以相互通信的協議,與http協議不同,http協議只能由客戶端想服務端發送請求后,服務端才能向客戶端響應消息。而webSocket協議卻可以主動向客戶端發送消息,這就是全雙工通信。


webSocket簡介

????????WebSocket 是一種基于 TCP 的網絡通信協議,設計用于在客戶端(通常是瀏覽器)和服務器之間建立一個持久化的、雙向通信通道。記住最主要的一句話就可以了:實時通信。

????????傳統的 HTTP 協議是 請求-響應模式,不適合實時性要求高的應用。而 WebSocket 允許服務器主動向客戶端推送消息,非常適合用于聊天室、在線游戲、股票行情、實時通知等場景。

全雙工與半雙工通信的區別:

半雙工允許數據在兩個方向上傳輸,但同一個時間段內只允許一個方向上的傳輸
全雙工允許數據在兩個方向上同時傳輸

特點:

WebSocket 是一種基于 TCP 的雙向通信協議,它與 HTTP 一樣在應用層運行,但一旦連接建立,通信通道就會一直保持開啟

它具備以下特點:

  • ?全雙工通信:客戶端和服務端都可以主動發送消息

  • 長連接:連接建立后無需頻繁重連

  • 低延遲:沒有 HTTP 多次握手的開銷

  • 瀏覽器支持廣泛:現代瀏覽器均已支持

連接原理解析:

  1. 首先還是會通過TCP的三次握手來建立連接
  2. 先由http發送一次請求,請求攜帶對應的請求頭,告訴服務端要升級協議
  3. 如果服務端支持該協議,也響應對應的響應頭,并且響應狀態碼設置為101,表示要切換協議
  4. 協議切換成功后,就可以使用webSocket進行雙向通信了

建立流程示例:?

客戶端API

示例:

<script>let ws = new WebSocket("ws://localhost/chat")ws.onopen = function(){};ws.onmessage = function(evt){//通過evt.data 可以獲取服務器發送的數據};ws.onclose(){};<script>

服務端API(java)

?Tomcat的7.0.5版本開始支持WebSocket,并且實現了Java WebSocket規范。

Java WebSocket應用由一系列的Endpoint組成。Endpoint是一個java對象,代表WebSocket鏈接的一端,對于服務端,我們可以視為處理具體WebSocket消息的接口。

其中,Endpoint對象就是客戶端與服務端建立連接時就創建的一個對象, 一個客戶端對應一個Endpoint對象。每個客戶端建立時都會創建一個。

Endpoint有兩種定義方式:編程試和注解試:

onOpen?當開啟一個新的會話時調用,該方法是客戶端與服務端握手成功后調用的方法@onOpen?
onClose當會話關閉時調用@onClose
onError當連接過程異常時調用@onError

?如何向客戶端發送消息?

發送消息則由 RemoteEndpoint完成,其實例由 Session維護。

????????通過session.getBasicRemote獲取同步消息發送的實例,然后調用其sendXxx()方法發送消息 ????????通過session.getAsyncRemote獲取異步消息發送實例,然后調用其sendXxx()方法發送消息



實戰案例

(1)引入依賴

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

(2)編寫服務端邏輯

@ServerEndpoint("/ws/chat")
@Component
public class ChatEndpoint {private static final Set<Session> sessions = ConcurrentHashMap.newKeySet();@OnOpenpublic void onOpen(Session session) {sessions.add(session);System.out.println("用戶連接: " + session.getId());}@OnMessagepublic void onMessage(String message, Session session) {System.out.println("收到消息: " + message);// 廣播給所有人for (Session s : sessions) {s.getAsyncRemote().sendText(message);}}@OnClosepublic void onClose(Session session) {sessions.remove(session);System.out.println("用戶斷開: " + session.getId());}@OnErrorpublic void onError(Session session, Throwable error) {System.err.println("錯誤: " + error.getMessage());}
}

(3)注冊配置類

這個類用于識別掃描所有添加了webSocket相關注解的類

@Configuration
public class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}
}

?(4)前端連接 WebSocket 示例

<script>const socket = new WebSocket("ws://localhost:8080/ws/chat");socket.onopen = () => {console.log("連接已建立");socket.send("你好 WebSocket!");};socket.onmessage = (event) => {console.log("收到消息: " + event.data);};socket.onclose = () => {console.log("連接關閉");};
</script>



Websocket與其他消息推送對比

輪詢方式最常見的就是掃碼登錄流程了,當用戶頁面出現一個二維碼時

輪詢:每隔一兩秒,向服務端發送一次請求,識別該二維碼有沒有被掃描到,服務端響應對應的消息。缺點:當用戶正好在發送某次請求后掃碼,那用戶也要等一兩秒后才能被響應,會有明顯卡頓。

長輪詢:客戶端想服務端發送一次請求,當服務端有數據變更時,二維碼被掃描到,或者請求超時時(一般是30s)才返回信息。


SSE也是支持長連接的,也使用與服務端主動進行消息推送,但瀏覽器的支持沒有webSocket好。而且通信也是單向的。



總結

WebSocket 是現代實時 Web 應用的重要基石,尤其在 Java 后端系統中,可以輕松通過 Spring Boot 快速構建支持高并發、低延遲的通信模塊。

  • 加入權限驗證(如 token 登錄校驗)

  • 使用 STOMP 協議進行消息分發與訂閱

  • 集成 SockJS 以兼容不支持 WebSocket 的客戶端

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

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

相關文章

路由器端口映射設置方法教程,和無公網IP內網穿透實現外網訪問方案步驟

隨著網絡技術的不斷發展&#xff0c;越來越多的個人和企業需要將自己的內部服務器或設備暴露給外部網絡訪問。這時&#xff0c;內網端口映射公網技術就顯得尤為重要。下面&#xff0c;我們將分別詳細介紹&#xff0c;有公網IP時如何設置路由器端口映射&#xff0c;和無公網IP內…

Linux 系統中從源碼編譯安裝軟件

以下是 Linux 系統中 從源碼編譯安裝軟件 的詳細步驟和注意事項&#xff0c;幫助你掌握這一高級操作技能&#xff1a; 一、編譯安裝的核心流程 1. 下載源碼包&#xff08;通常為 .tar.gz/.tar.bz2/.tar.xz&#xff09; 2. 解壓源碼包 3. 進入源碼目錄 4. 配置編譯參數&#xf…

HTTP:二.URI及相關術語

HTTP相關技術和術語 WEB開發語言 **http:**Hyper Text Transfer Protocol 應用層協議,默認端口: 80/tcp WEB前端開發語言: htmlcssjavascripthtml Hyper Text Markup Language 超文本標記語言,編程語言,主要負責實現頁面的結構 范例:html 語言 <html> <h…

Java網絡編程干貨

1.網絡編程是什么 了解 在Java語言中&#xff0c;我們可以使用java.net包下的技術輕松開發出常見的網絡應用程序&#xff0c;從而把分布在不同地理區域的計算機與專門的外部設備用通信線路互連成一個規模大、功能強的網絡系統&#x…

Java—HTML:CSS選擇器

今天我要介紹的知識點內容是Java HTML中的CSS選擇器&#xff1b; CSS選擇器用于定位HTML元素并為其添加樣式。它允許我們控制網頁的顏色、字體、布局和其他視覺元素。通過分離內容與樣式。 下面我將介紹CSS中選擇器的使用&#xff0c;并作舉例說明&#xff1b; 選擇器基本語…

【2025藍橋杯】賽前2小時考點梳理C++版

【2025藍橋杯】賽前2小時考點梳理 1. &#x1f9e9; STL&#xff08;優先級最高&#xff09; 核心容器/函數 vector push_back() / pop_back() / size()string substr(pos, len) / find(str) / queue push() / front() / pop()priority_queue 默認大根堆&#xff0c;小根堆&…

汽車性能的幕后保障:慧通測控電動尾翼綜合力學測試淺析

在汽車性能不斷追求極致的當下&#xff0c;電動尾翼已成為眾多高性能車型以及部分新能源汽車提升空氣動力學表現與操控穩定性的關鍵配置。從炫酷的超跑到注重續航與駕駛體驗的新能源車&#xff0c;電動尾翼正逐漸嶄露頭角。它絕非僅僅是外觀上的裝飾&#xff0c;而是能在車輛行…

2、文件上傳漏洞的防范

原文地址:文件上傳漏洞的防范 更多內容請關注&#xff1a;代碼安全 PHP安全編碼——書寫安全的代碼 文件上傳漏洞的防范 提問 問題1&#xff1a;上傳漏洞是怎么產生的&#xff1f; 問題2&#xff1a;是否可以只用js判斷文件類型而php不判斷&#xff1f; 問題3&#…

06軟件測試需求分析案例-添加用戶

給職業顧問部的老師添加用戶密碼后&#xff0c;他們才能登錄使用該軟件。只有admin賬戶具有添加用戶、修改用戶信息、刪除用戶的權利。admin是經理或團隊的第一個人的賬號&#xff0c;后面招一個教師就添加一個賬號。 通讀需求是提取信息&#xff0c;提出問題&#xff0c;輸出…

Ex-Human:在DigitalOcean云平臺之上,構建下一代 AI 數字人

Ex-Human 正在通過創造極具吸引力和富有同理心的人工智能角色&#xff0c;重新定義人們與人工智能的互動方式。該公司由 Artem Rodichev 創立&#xff0c;讓用戶能夠通過文本、圖像、視頻和音頻創建能互動的獨一無二的數字人物。憑借每月超過一百萬的活躍用戶和五百萬個定制創建…

從零實現HTTP服務器

響應&#xff1a; 第一部分測試代碼&#xff0c;讀取請求 Makefile binhttpserver #生成的可執行程序 ccg #編譯器名稱 LD_FLAGS-stdc11 -lpthread #-DDEBUG1 #鏈接選項 srcmain.cc$(bin):$(src)$(cc) -o $ $^ $(LD_FLAGS).PHONY:clean clean:rm -f $(bin) 1111111 main.cc…

構建高可靠C++服務框架:從日志系統到任務調度器的完整實現

構建高可靠C服務框架&#xff1a;從日志系統到任務調度器的完整實現 一、深度解析示例代碼技術體系 1.1 日志系統的進階應用 示例代碼中的ZRY_LOG_XXX宏展示了基礎日志功能&#xff0c;但在生產環境中我們需要更完善的日志系統&#xff1a; 推薦技術棧組合&#xff1a; sp…

小張的工廠進化史——工廠模式

小張的工廠進化史——工廠模式 一、簡單工廠模式&#xff1a;全能生產線二、工廠方法模式&#xff1a;分品牌代工三、抽象工廠模式&#xff1a;生態產品族四、三種模式核心對比表五、結合Spring實現簡單工廠&#xff08;實踐&#xff09; 小張從華強北起家&#xff0c;最初只有…

Python中的eval()函數詳解

文章目錄 Python中的eval()函數詳解基本語法基本用法安全性問題安全使用建議實際應用場景與exec()的區別性能考慮總結 Python中的eval()函數詳解 eval()是Python的一個內置函數&#xff0c;用于執行字符串形式的Python表達式并返回結果。它是一個強大但需要謹慎使用的函數。 …

銀行業務發展歷史

銀行業務發展歷史 銀行業務的發展可以追溯到古代&#xff0c;但其現代形式的發展可以追溯到中世紀。以下是銀行業務發展的主要歷史階段&#xff1a; 1. 古代和中世紀時期 特點&#xff1a;商人提供貸款和存款服務&#xff0c;充當中間人轉移資金&#xff0c;發行紙幣作為支付…

SQL實戰篇,數據庫在Kooboo中的實際應用(一)

本文將結合實際操作與代碼示例&#xff0c;展示SQL 在 Kooboo 中的實際應用 僅需兩步&#xff1a;動態創建表 基礎查詢&#xff0c;無需復雜配置&#xff0c;快速上手&#xff01; 一、動態創建表&#xff1a;插入數據 Kooboo 支持多種數據庫&#xff0c;以 SQLite 為例&…

克魔助手(Kemob)安裝與注冊完整教程 - Windows/macOS雙平臺指南

iOS設備管理工具克魔助手便攜版使用全指南 前言&#xff1a;為什么需要專業的iOS管理工具 在iOS開發和設備管理過程中&#xff0c;開發者經常需要突破系統限制&#xff0c;實現更深層次的控制和調試。本文將詳細介紹一款實用的便攜式工具的使用方法&#xff0c;幫助開發者快速…

搜索插入位置 -- 二分查找

目錄 一&#xff1a;題目 二:算法原理 三&#xff1a;代碼分析 一&#xff1a;題目 題目鏈接&#xff1a;35. 搜索插入位置 - 力扣&#xff08;LeetCode&#xff09; 二:算法原理 三&#xff1a;代碼分析 class Solution { public:int searchInsert(vector<int>&am…

Apache Doris內存與超時參數配置詳解

一、查詢任務內存限制調整 1. ?默認內存限制與問題定位 Apache Doris默認限制單個BE節點上的查詢任務內存使用不超過2GB&#xff08;即exec_mem_limit2147483648字節&#xff09;。當復雜查詢或大規模數據操作超過此限制時&#xff0c;會觸發Memory limit exceeded錯誤。通過…

龍虎榜——20250411

今天縮量&#xff0c;上方壓力依然在&#xff0c;外圍還在升級&#xff0c;企穩還需要時日。 2025年4月11日龍虎榜行業方向分析 一、核心主線方向 半導體與芯片&#xff08;國產替代加速&#xff09; ? 代表標的&#xff1a;圣邦股份&#xff08;模擬芯片&#xff09;、中電…