前端WebSocket實時通信實現

在項目中使用WebSocket實現實時通信

WebSocket提供了一種在客戶端和服務器之間建立持久連接的方式,可以實現實時數據交換。下面我將展示如何在前端項目中集成WebSocket功能。

設計思路

我將創建一個簡單的聊天室界面來演示WebSocket的使用,包含以下功能:

  • 建立WebSocket連接
  • 發送和接收消息
  • 顯示連接狀態
  • 錯誤處理和重連機制

實現代碼

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>WebSocket 聊天室</title><style>* {box-sizing: border-box;margin: 0;padding: 0;}body {font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;line-height: 1.6;color: #333;background-color: #f5f7fa;padding: 20px;}.container {max-width: 800px;margin: 0 auto;background: white;border-radius: 10px;box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);overflow: hidden;}header {background: #4a6ee0;color: white;padding: 20px;text-align: center;}.status-bar {display: flex;justify-content: space-between;align-items: center;padding: 10px 20px;background: #f0f4ff;border-bottom: 1px solid #e0e6ff;}.status {display: flex;align-items: center;}.status-indicator {width: 10px;height: 10px;border-radius: 50%;margin-right: 8px;}.connected {background: #4caf50;}.disconnected {background: #f44336;}.chat-container {padding: 20px;height: 400px;overflow-y: auto;background: #fafbff;}.message {margin-bottom: 15px;padding: 10px 15px;border-radius: 18px;max-width: 80%;word-break: break-word;}.received {background: #e6eeff;border-top-left-radius: 4px;align-self: flex-start;}.sent {background: #4a6ee0;color: white;border-top-right-radius: 4px;margin-left: auto;}.message-input {display: flex;padding: 15px;border-top: 1px solid #e0e6ff;background: #fafbff;}input {flex: 1;padding: 12px 15px;border: 1px solid #d0d9ff;border-radius: 20px;outline: none;font-size: 16px;}button {background: #4a6ee0;color: white;border: none;border-radius: 20px;padding: 12px 20px;margin-left: 10px;cursor: pointer;font-weight: bold;transition: background 0.3s;}button:hover {background: #3a5ec0;}button:disabled {background: #cccccc;cursor: not-allowed;}</style>
</head>
<body><div class="container"><header><h1>WebSocket 聊天室</h1></header><div class="status-bar"><div class="status"><div class="status-indicator disconnected" id="statusIndicator"></div><span id="statusText">未連接</span></div><button id="connectButton">連接</button></div><div class="chat-container" id="chatContainer"><div class="message received">歡迎使用聊天室!請點擊"連接"按鈕開始。</div></div><div class="message-input"><input type="text" id="messageInput" placeholder="輸入消息..." disabled><button id="sendButton" disabled>發送</button></div></div><script>document.addEventListener('DOMContentLoaded', function() {const statusIndicator = document.getElementById('statusIndicator');const statusText = document.getElementById('statusText');const connectButton = document.getElementById('connectButton');const chatContainer = document.getElementById('chatContainer');const messageInput = document.getElementById('messageInput');const sendButton = document.getElementById('sendButton');let websocket = null;const serverUrl = 'wss://echo.websocket.org'; // 這是一個公共的WebSocket測試服務器// 更新連接狀態UIfunction updateConnectionStatus(connected) {if (connected) {statusIndicator.className = 'status-indicator connected';statusText.textContent = '已連接';connectButton.textContent = '斷開';messageInput.disabled = false;sendButton.disabled = false;} else {statusIndicator.className = 'status-indicator disconnected';statusText.textContent = '未連接';connectButton.textContent = '連接';messageInput.disabled = true;sendButton.disabled = true;}}// 添加消息到聊天窗口function addMessage(content, isSent = false) {const messageElement = document.createElement('div');messageElement.className = `message ${isSent ? 'sent' : 'received'}`;messageElement.textContent = content;chatContainer.appendChild(messageElement);// 滾動到底部chatContainer.scrollTop = chatContainer.scrollHeight;}// 建立WebSocket連接function connect() {try {websocket = new WebSocket(serverUrl);websocket.onopen = function(event) {updateConnectionStatus(true);addMessage('已連接到服務器');};websocket.onmessage = function(event) {addMessage(event.data);};websocket.onclose = function(event) {updateConnectionStatus(false);addMessage('連接已關閉');websocket = null;};websocket.onerror = function(error) {console.error('WebSocket錯誤:', error);addMessage('發生錯誤,連接已斷開');updateConnectionStatus(false);};} catch (error) {console.error('無法建立連接:', error);addMessage('無法連接到服務器: ' + error.message);updateConnectionStatus(false);}}// 關閉WebSocket連接function disconnect() {if (websocket) {websocket.close();}}// 發送消息function sendMessage() {const message = messageInput.value.trim();if (message && websocket && websocket.readyState === WebSocket.OPEN) {websocket.send(message);addMessage(message, true);messageInput.value = '';}}// 連接/斷開按鈕點擊事件connectButton.addEventListener('click', function() {if (websocket && websocket.readyState === WebSocket.OPEN) {disconnect();} else {connect();}});// 發送按鈕點擊事件sendButton.addEventListener('click', sendMessage);// 按Enter鍵發送消息messageInput.addEventListener('keypress', function(event) {if (event.key === 'Enter') {sendMessage();}});});</script>
</body>
</html>

使用說明

  1. 頁面加載后,點擊"連接"按鈕建立WebSocket連接
  2. 連接成功后,可以在輸入框中輸入消息并點擊"發送"或按Enter鍵
  3. 發送的消息會顯示在右側(藍色),接收的消息顯示在左側(淺藍色)
  4. 可以隨時點擊"斷開"按鈕結束連接

實際項目中的注意事項

  1. 生產環境URL:示例中使用的是測試服務器,實際項目中應替換為您的WebSocket服務器地址
  2. 安全連接:生產環境應使用wss://(WebSocket Secure)而不是ws://
  3. 錯誤處理:需要根據實際需求完善錯誤處理和重連機制
  4. 身份驗證:實際應用中通常需要在建立連接時進行身份驗證
  5. 數據格式:通常使用JSON格式進行復雜數據交換

擴展功能

在實際項目中,您可能需要添加:

  • 心跳機制保持連接活躍
  • 消息重發機制確保消息送達
  • 連接狀態監控和自動重連
  • 支持不同的消息類型(文本、圖片、文件等)
  • 用戶身份標識和會話管理

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

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

相關文章

電磁流量計可靠品牌之選,基恩士提供多樣化解決方案

引言在工業自動化領域&#xff0c;流量的精確計量是保障產品質量、優化成本和提升設備效率的關鍵一環。當面臨“電磁流量計的可靠品牌”這一問題時&#xff0c;企業通常需要考量產品的耐用性、測量精度、維護成本以及系統集成能力。流量計在安裝、維護和測量精度方面面臨諸多挑…

NumPy數組與Python列表的賦值行為解析

在Python科學計算中&#xff0c;NumPy數組和Python原生列表是兩種常用的數據結構。理解它們之間的賦值行為差異對于編寫高效、正確的代碼至關重要。本文將深入探討NumPy數組賦值給Python變量的各種情況&#xff0c;揭示背后的內存機制和類型轉換特性。 直接賦值行為分析 當我們…

中國制造難點在哪里?

最近生產一批板子&#xff0c;其中一個進口的連接器為什么能賣我們差不多一千多錢還沒現貨&#xff0c;有時候還禁售&#xff1b;規格書也就寥寥一頁而已&#xff0c;外觀看起來也淡淡無奇&#xff0c;身為制造業強國的我們為什么沒人做呢&#xff1f;你們怎么看&#xff1f;#中…

python 讀取大文件優化示例

核心方法逐行讀取 - 最常用&#xff0c;內存占用O(1)分塊讀取 - 適合超大文件&#xff0c;可控制內存使用內存映射 - 高性能&#xff0c;虛擬內存映射緩沖讀取 - 平衡性能和內存特殊場景處理CSV文件 - 使用pandas的chunksize參數JSON Lines - 逐行解析JSON對象文本分析 - 內存高…

VBA數據結構深度解析:字典對象與集合對象的性能終極對決

VBA數據結構大揭秘:Dictionary與Collection,誰才是性能王者? 某頭部券商的風控系統曾遭遇"數據黑洞"危機:使用Collection處理10萬條交易記錄時,系統響應時間長達47秒,而改用Dictionary后僅需3.2秒——效率差距達14.7倍!這背后是VBA開發者普遍存在的認知盲區:…

【系統分析師】2025年上半年真題:論文及解題思路

更多內容請見: 備考系統分析師-專欄介紹和目錄 文章目錄 試題一:論信息系統運維管理技術與應用 試題二:論軟件系統測試方法及應用 試題三:論信息系統開發方法及應用 試題四:論模型驅動分析方法及應用 試題一:論信息系統運維管理技術與應用 智能運維(AIOps)是以人工智能…

立創·廬山派K230CanMV開發板的進階學習——顏色識別

學習目標&#xff1a;立創廬山派K230CanMV開發板的進階學習——顏色識別學習內容&#xff1a;顏色識別 顏色識別 1. 本節介紹 &#x1f4dd; 學習內容&#xff1a;本節將學習基于顏色閾值的色塊檢測技術&#xff0c;通過定義特定顏色范圍&#xff0c;從攝像頭采集的圖像中識別并…

【實時Linux實戰系列】V4L2 采集零拷貝:DMA-BUF 在低延遲視頻中的應用

在實時視頻處理系統中&#xff0c;視頻幀的高效傳輸和處理是確保系統低延遲和高吞吐量的關鍵。傳統的視頻采集和處理流程中&#xff0c;數據拷貝是一個常見的性能瓶頸&#xff0c;它不僅增加了處理延遲&#xff0c;還可能導致幀間抖動。為了克服這些問題&#xff0c;Linux 提供…

STM32精準控制水流

如何用STM32精準控制水的流量&#xff1f;一、系統組成框圖------------- ------------ ----------- -------------| | | | | | | || 流量傳感器 -----> STM32 ----->| 驅動電路 ----->…

吃透 Vue 樣式穿透:從 scoped 原理到組件庫樣式修改實戰

在 Vue 項目開發中&#xff0c;我們經常會引入 Element Plus、Vant、Ant Design等成熟組件庫來提升開發效率。但即便組件庫提供了基礎樣式配置&#xff0c;實際業務中仍需根據設計需求調整組件內部細節樣式——這時候&#xff0c;「樣式穿透」就成了必須掌握的技能。而要理解樣…

記一次維修網橋經歷

1.前言 前倆天突然下大雨了&#xff0c;大雨過后我也迎來斷網時刻&#xff0c;經過簡單排查發現是網絡的網橋這條線路無法連通。 猜測1 可能是網線損壞&#xff0c;2 網橋損壞 2.拆解 經過測試網線設備后發現是網橋的問題&#xff0c;嘗試reset發現無反應&#xff08;正常情況重…

OceanBase001-入門--里面有的概念不確定文章作為了解使用

目錄資料來源特點支持和不支持的點名詞概念租戶資源池租戶使用資源數據庫表分區示例資料來源 B站視頻 點擊跳轉 特點 分兩個版本 企業版支持Oracle 和MySql 社區版本支持 MySql 這里視頻這么講解的。后續有沒有社區版本什么樣子不知道&#xff0c;請不要噴我 單節點部署 兼…

KITTI數據集

KITTI數據集是由德國卡爾斯魯厄理工學院 Karlsruhe Institute of Technology (KIT) 和美國芝加哥豐田技術研究院 Toyota Technological Institute at Chicago (TTI-C) 于2012年聯合創辦&#xff0c;是目前國際上最為常用的自動駕駛場景下的計算機視覺算法評測數據集之一。該數據…

rk3568移植WebRTC AudioProcessing

前言&#xff1a; 大家好&#xff0c;我是飛一樣的成長&#xff0c;今天這篇文章主要想分享音頻3A的內容。在之前有網友找我怎么移植原生的webrtc到rk3568/rk3588上&#xff0c;當時我自己也沒有移植過&#xff0c;后面折騰了一個禮拜才搞定&#xff0c;當時遇到的最大問題&…

介紹一下 RetNet

RetNet&#xff08;Retention Network&#xff09;是微軟亞洲研究院于 2023 年提出的一種新型序列建模架構&#xff0c;旨在解決 Transformer 架構在長序列處理中存在的計算復雜度高、內存占用大、推理速度慢等核心問題。它通過創新的 “循環注意力機制”&#xff0c;實現了 “…

CANopen - PDO映射

CiA402為什么不放到一個PDO中。而是分成幾個PDO? 簡短答案&#xff1a;裝不下 解耦時序。 PDO負載上限&#xff1a;經典CAN的每個PDO只有8字節。TargetPosition(607A:0032bit) ProfileVelocity(60FF:0032bit) ModesOfOperation(6060:008bit) 共9字節&#xff0c;單個PDO放不…

北理工提出僅依賴機載傳感器針對IAP的控制與狀態估計框架

近日&#xff0c;度量用戶、北京理工大學俞玉樹老師團隊在IEEE RAL&#xff0c;IEEE TRO和IEEE TASE期刊上分別發表論文&#xff0c;研究著力于解決多飛行器集聯平臺&#xff08;Integrated Aerial Platforms, IAPs&#xff09;的相對位姿和全局定位問題&#xff0c;提出IAP的控…

13年測試老鳥,性能測試-618與雙11大促銷壓測(二)

目錄&#xff1a;導讀 前言一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結&#xff08;尾部小驚喜&#xff09; 前言 1、準備工作 準備…

StreamCap(直播錄制) v1.0.2 綠色版

StreamCap 是一個基于FFmpeg和StreamGet的多平臺直播流錄制客戶端&#xff0c;覆蓋 40 國內外主流直播平臺&#xff0c;支持批量錄制、循環監控、定時監控和自動轉碼等功能。軟件特色 多端支持&#xff1a;支持Windows/MacOS/Web運行。循環監控&#xff1a;實時監控直播間狀態&…

OpenCV:圖像拼接(SIFT 特征匹配 + 透視變換)

目錄 一、核心技術原理與對應 API 解析 1.1 SIFT 特征檢測與描述&#xff08;尺度不變特征提取&#xff09; 1.1.1 灰度圖轉換&#xff1a;cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 1.1.2 SIFT 檢測器初始化&#xff1a;cv2.SIFT_create() 1.1.3 特征點檢測與描述符計算&…