WebSocket的基本使用方法

一. 與HTTP對比

WebSocket 是一種在單個 TCP 連接上實現全雙工(雙向)通信的網絡協議,它解決了傳統 HTTP 協議 “請求 - 響應” 模式的局限性,讓客戶端(如瀏覽器)和服務器能建立持久連接,實現實時數據交互。

HTTP是短鏈接且單向通信,只有客戶端主動發請求,服務器才能被動響應,無法主動向客戶端推數據。WebSocket是長連接且支持雙向通信

WebSocket通過一次HTTP握手建立持久TCP連接,之后客戶端與服務器可基于該連接全雙工、實時雙向收發數據,無需反復建立連接。

二. WebSocket的關鍵特性

  1. 全雙工通信:客戶端和服務器可同時發送數據,無需等待對方響應。
  2. 持久連接:連接建立后長期保持,除非主動斷開(如客戶端關閉頁面、服務器重啟)。
  3. 跨域支持:WebSocket 本身支持跨域(類似 CORS),可通過?Origin?請求頭和服務器配置控制跨域權限。
  4. 支持二進制數據:不僅能傳文本(如 JSON),還能直接傳二進制數據(如圖片、音頻、視頻流),比 HTTP 傳輸二進制更高效。
  5. 自動重連(需手動實現):原生 WebSocket 不支持自動重連,實際項目中需通過代碼邏輯實現(如監聽?onclose?事件,延遲后重新發起連接)。

三.?WebSocket 的典型應用場景

只要涉及 “實時數據交互” 的場景,WebSocket 都是優選方案:

  • 即時通訊:在線聊天(如微信網頁版、企業 IM)、客服對話。
  • 實時通知:訂單狀態更新(如 “訂單已發貨”)、消息推送(如點贊提醒)。
  • 實時數據展示:股票 / 數字貨幣行情、體育賽事比分、監控系統數據(如服務器 CPU 使用率)。
  • 協同工具:多人在線文檔編輯(如騰訊文檔)、白板協作。
  • 流媒體:低延遲的音視頻通話(如 WebRTC 基于 WebSocket 做信令交互)、直播彈幕。

四. 實現步驟

1.前端(瀏覽器原生API)

瀏覽器內置WebSocket對象,可直接發送連接和處理數據。

這里以一個簡單實現為例

<!DOCTYPE HTML>
<html>
<head><meta charset="UTF-8"><title>WebSocket Demo</title>
</head>
<body><input id="text" type="text" /><button onclick="send()">發送消息</button><button onclick="closeWebSocket()">關閉連接</button><div id="message"></div>
</body>
<script type="text/javascript">var websocket = null;var clientId = Math.random().toString(36).substr(2);//判斷當前瀏覽器是否支持WebSocketif('WebSocket' in window){//連接WebSocket節點websocket = new WebSocket("ws://localhost:8080/ws/"+clientId);}else{alert('Not support websocket')}//連接發生錯誤的回調方法websocket.onerror = function(){setMessageInnerHTML("error");};//連接成功建立的回調方法websocket.onopen = function(){setMessageInnerHTML("連接成功");}//接收到消息的回調方法websocket.onmessage = function(event){setMessageInnerHTML(event.data);}//連接關閉的回調方法websocket.onclose = function(){setMessageInnerHTML("close");}//監聽窗口關閉事件,當窗口關閉時,主動去關閉websocket連接,防止連接還沒斷開就關閉窗口,server端會拋異常。window.onbeforeunload = function(){websocket.close();}//將消息顯示在網頁上function setMessageInnerHTML(innerHTML){document.getElementById('message').innerHTML += innerHTML + '<br/>';}//發送消息function send(){var message = document.getElementById('text').value;websocket.send(message);}//關閉連接function closeWebSocket() {websocket.close();}
</script>
</html>

2. 后端

2.1?導入WebSocket的maven坐標

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

2.2 導入WebSocket服務端組件WebSocketServer,用于和客戶端通信

/*** WebSocket服務*/
@Component // 交給 Spring 管理
@ServerEndpoint("/ws/{sid}")
//聲明這是一個 WebSocket 服務端,路徑為 /websocket/{sid}(支持路徑參數)
public class WebSocketServer {//存放會話對象private static Map<String, Session> sessionMap = new HashMap();/*** 連接建立成功調用的方法*/@OnOpenpublic void onOpen(Session session, @PathParam("sid") String sid) {System.out.println("客戶端:" + sid + "建立連接");sessionMap.put(sid, session);}/*** 收到客戶端消息后調用的方法* @param message 客戶端發送過來的消息*/@OnMessagepublic void onMessage(String message, @PathParam("sid") String sid) {System.out.println("收到來自客戶端:" + sid + "的信息:" + message);}/*** 連接關閉調用的方法* @param sid*/@OnClosepublic void onClose(@PathParam("sid") String sid) {System.out.println("連接斷開:" + sid);sessionMap.remove(sid);}/*** 群發* @param message*/public void sendToAllClient(String message) {Collection<Session> sessions = sessionMap.values();for (Session session : sessions) {try {//服務器向客戶端發送消息session.getBasicRemote().sendText(message);} catch (Exception e) {e.printStackTrace();}}}}

WebSocketServer的代碼格式基本就是這樣,可以根據需要自行修改。

2.3 導入配置類WebSocketConfiguration,注冊WebSocket的服務端組件

/*** WebSocket配置類,用于注冊WebSocket的Bean*/
@Configuration
public class WebSocketConfiguration {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}}

前端和后端建立 WebSocket 連接的過程可分為 “握手” 和 “連接維持” 兩步:

  1. 握手階段:前端通過?new WebSocket('ws://服務器地址')?發起 HTTP 升級請求,攜帶?Upgrade: websocket?等頭信息;后端驗證后返回?101 Switching Protocols?響應,完成協議切換。
  2. 連接維持:握手成功后,TCP 連接保持持久狀態,雙方通過 WebSocket 幀格式直接雙向收發數據,直到某一方主動關閉連接。

核心流程:前端發 HTTP 請求(帶升級標識)→ 2. 后端驗證并返回 101 響應 → 3. 協議切換為 WebSocket → 4. 基于持久 TCP 連接雙向通信。

2.4 導入定時任務類WebSocketTask,定時向客戶端推送數據

這相當于一個案例,如何使用WebSocketServer。

@Component
public class WebSocketTask {@Autowiredprivate WebSocketServer webSocketServer;/*** 通過WebSocket每隔5秒向客戶端發送消息*/@Scheduled(cron = "0/5 * * * * ?")public void sendMessageToClient() {webSocketServer.sendToAllClient("這是來自服務端的消息:" + DateTimeFormatter.ofPattern("HH:mm:ss").format(LocalDateTime.now()));}
}

當我們想向前端頁面推送消息時WebSocketTask的方法sendMessageToClient,如果要傳遞一個對象,注意將其轉換成json格式,例如:

 Map map = new HashMap();map.put("type", 2);//1表示來單提醒 2表示客戶催單map.put("orderId", id);map.put("content", "訂單號:" + orders.getNumber());String json = JSON.toJSONString(map);// 通過WebSocket向客戶端瀏覽器推送消息webSocketServer.sendToAllClient(json);

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

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

相關文章

架構選型:為何用對象存儲替代HDFS構建現代數據湖

在過去十余年的大數據浪潮中&#xff0c;Hadoop及其核心組件HDFS&#xff08;Hadoop分布式文件系統&#xff09;無疑是整個技術生態的基石。它開創性地解決了海量數據的分布式存儲難題&#xff0c;支撐了無數企業從數據中挖掘價值。然而&#xff0c;隨著數據規模的指數級增長以…

智能養花誰更優?WebIDE PLOY技術與裝置的結合及實踐價值 —— 精準養護的賦能路徑

一、WebIDEPLOY 技術支撐下的智能養花系統核心構成在 WebIDEPLOY 技術的框架下&#xff0c;智能養花裝置形成了一套精準協同的閉環系統&#xff0c;其核心在于通過技術整合實現 “監測 - 決策 - 執行 - 遠程交互” 的無縫銜接&#xff0c;讓植物養護更貼合城市居民的生活節奏。…

基于llama.cpp在CPU環境部署Qwen3

大家好,我是奇文王語,NLP愛好者,長期分享大模型實戰技巧,歡迎關注交流。 最近兩天在研究如何使用小規模參數的模型在CPU環境上進行落地應用,比如模型Qwen3-0.6B。開始使用Transformers庫能夠正常把模型服務進行部署起來,但是通過測試速度比較慢,用戶的體驗會比較差。 …

?NAT穿透技術原理:P2P通信中的打洞機制解析?

要說網絡世界里的 “幕后功臣”&#xff0c;NAT 絕對得算一個&#xff0c;大家伙兒有沒有琢磨過&#xff0c;為啥家里的電腦、手機&#xff0c;還有公司那一堆設備&#xff0c;都能同時連上網&#xff0c;還不打架呢&#xff1f; NAT 這東西&#xff0c;全名叫網絡地址轉換&am…

工業 5G + AI:智能制造的未來引擎

工業 5G AI&#xff1a;智能制造的未來引擎 文章目錄工業 5G AI&#xff1a;智能制造的未來引擎摘要一、為什么工業需要 5G&#xff1f;二、工業 5G 的典型應用場景1. 智能制造工廠2. 遠程控制與運維3. 智慧物流與倉儲4. 能源、電力、礦山5. 智慧港口與交通三、成功案例解析1…

邊緣計算設備 RK3576芯片

RK3576是瑞芯微&#xff08;Rockchip&#xff09;公司專為人工智能物聯網&#xff08;AIoT&#xff09;市場精心設計的一款高算力、高性能及低功耗的國產化應用處理器。該處理器采用了先進的ARM架構&#xff0c;集成了四個ARM Cortex-A72高性能核心與四個ARM Cortex-A53高效能核…

ROS1系列學習筆記之T265的Python數據訂閱顯示、串口輸出到凌霄飛控,以及開機自啟動設置等一些問題處理方法(持續更新)

前言 關于T265的環境配置與安裝&#xff0c;在前兩期的ROS筆記中已經提及&#xff0c;包括英特爾本家的SDK安裝&#xff0c;以及對應支持版本的ROS支持開發工具包。 ROS1系列學習筆記之Linux&#xff08;Ubuntu&#xff09;的環境安裝、依賴準備、踩坑提示&#xff08;硬件以…

UART控制器——ZYNQ學習筆記14

UART 控制器是一個全雙工異步收發控制器&#xff0c; MPSoC 內部包含兩個 UART 控制器&#xff0c; UART0 和 UART1。每一個 UART 控制器支持可編程的波特率發生器、 64 字節的接收 FIFO 和發送 FIFO、產生中斷、 RXD 和TXD 信號的環回模式設置以及可配置的數據位長度、停止位和…

C++ 登錄狀態機項目知識筆記

C 登錄狀態機項目知識筆記 1. 項目源碼 1.1 login_state_machine.h #pragma once#include <string>// 登錄狀態枚舉 enum class LoginState { IDLE, AUTHENTICATING, SUCCESS, FAILURE, LOCKED };// 登錄事件枚舉 enum class LoginEvent { REQUEST, SUCCESS, FAILURE, RE…

docker-nacos-v3

nacos官網&#xff1a; Redirecting to: https://nacos.io/ 服務發現和服務健康監測 Nacos 支持基于 DNS 和基于 RPC 的服務發現。服務提供者使用 原生SDK、OpenAPI、或一個獨立的Agent TODO注冊 Service 后&#xff0c;服務消費者可以使用DNS TODO 或HTTP&API查找和發現服…

DevOps 詳解:文化、實踐與工具鏈

目錄一、DevOps 定義與核心目標二、DevOps 關鍵原則與實踐1. 持續集成&#xff08;CI&#xff0c;Continuous Integration&#xff09;2. 持續交付&#xff08;CD&#xff0c;Continuous Delivery&#xff09;3. 持續部署&#xff08;Continuous Deployment&#xff09;4. 監控…

人工智能之數學基礎:常用的連續型隨機變量的分布

本文重點 本文將介紹概率中非常重要的連續型隨機變量的分布,主要有均勻分布、指數分布、正態分布 均勻分布 若隨機變量X的概率密度為: 如果概率密度函數如上所示,則稱X服從區間[ a, b]上的均勻分布,記作X~U[a,b] 均勻分布的概率密度函數的計算如下: 指數分布 指數分布…

【開題答辯全過程】以 校園幫幫團跑腿系統的設計與實現為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

Milvus 向量數據庫開發實戰指南

Milvus向量數據庫是什么&#xff1f;-CSDN博客 一、核心概念解析 1.1 基礎概念 1.1.1 Bitset&#xff08;位集&#xff09; 高效的數據表示方式&#xff0c;使用位數組替代傳統數據類型 默認情況下&#xff0c;位值根據特定條件設置為 0 或 1 1.1.2 通道機制 PChannel&am…

vcruntime140.dll丟失解決辦法

解決辦法 安裝Microsoft Visual C Redistributable https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?viewmsvc-170

LabVIEW實現跨 VI 簇按鈕控制功能

?在 LabVIEW 開發場景中&#xff0c;常需實現不同 VI 間的交互操作。本功能借助 VI Server 技術&#xff0c;突破 VI 邊界&#xff0c;實現對目標 VI 中簇內按鈕控件的屬性讀取與控制&#xff0c;為多 VI 協同、對VI里已經實現的功能&#xff0c;可以在其他VI中直接使用&#…

JS箭頭函數

JavaScript 的箭頭函數 (Arrow Function) 是 ES6 (ECMAScript 2015) 引入的一種重要的函數語法特性&#xff0c;它用更簡潔的方式定義函數&#xff0c;并改變了 this 的綁定行為。 箭頭函數和傳統函數的主要區別&#xff1a;特性箭頭函數傳統函數語法更簡潔&#xff0c;省略 fu…

linux內核 - 文件系統相關的幾個概念介紹

介紹文件系統之前&#xff0c;先了解下存儲管理的幾個概念&#xff1a;1. 硬盤&#xff1a;是最底層的存儲介質&#xff0c;比如 /dev/sda, /dev/nvme0n1. 一個物理硬盤就是一個塊設備&#xff0c;未經處理是只能順序讀寫二進制數據。 2. 分區&#xff1a;就是在硬盤上劃分出不…

邊緣計算(Edge Computing)+ AI:未來智能世界的核心引擎

邊緣計算&#xff08;Edge Computing&#xff09; AI&#xff1a;未來智能世界的核心引擎 文章目錄邊緣計算&#xff08;Edge Computing&#xff09; AI&#xff1a;未來智能世界的核心引擎摘要什么是邊緣計算&#xff1f;為什么需要邊緣計算&#xff1f;1. 延遲問題2. 帶寬壓力…

計算機視覺與深度學習 | ORB-SLAM3算法原理與Matlab復現指南

文章目錄 一、算法核心原理 1.1 系統架構概述 1.2 數學模型基礎 1.2.1 狀態估計框架 1.2.2 視覺-慣導融合模型 1.3 關鍵創新點 二、關鍵模塊實現細節 2.1 ORB特征提取與匹配 2.2 地圖初始化 2.3 視覺-慣導融合 2.4 回環檢測與優化 三、Matlab復現思路 3.1 系統模塊劃分 3.2 核心…