【WebSocket?】入門之旅(三):WebSocket 的實戰應用

本篇文章將通過構建一個簡單的實時聊天應用,演示如何在前端和后端搭建 WebSocket 系統,完成實時消息傳輸。通過實戰,幫助你更好地理解 WebSocket 在實際項目中的應用。


目錄

  1. 搭建 WebSocket 服務器
  2. WebSocket 客戶端實現
  3. 實時聊天應用示例
  4. 常見問題與解決方案
  5. 小結

搭建 WebSocket 服務器

首先,我們需要搭建一個 WebSocket 服務器。這里我們使用 Node.js 和 ws 庫來搭建服務器。ws 是一個常用的 WebSocket 實現,支持高效的雙向通信。

1. 安裝 ws

在項目中安裝 ws 庫:

npm install ws

2. 創建 WebSocket 服務器

接下來,我們編寫一個簡單的 WebSocket 服務器,處理客戶端的連接和消息。

// websocket-server.js
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });// 當有客戶端連接時
wss.on('connection', (ws) => {console.log('客戶端已連接');// 當接收到客戶端消息時ws.on('message', (message) => {console.log('收到消息: ', message);// 將消息發送給所有連接的客戶端wss.clients.forEach((client) => {if (client !== ws && client.readyState === WebSocket.OPEN) {client.send(message);}});});// 連接關閉時ws.on('close', () => {console.log('客戶端斷開連接');});
});console.log('WebSocket 服務器啟動,監聽 8080 端口...');

在上面的代碼中:

  • 我們創建了一個 WebSocket 服務器,監聽 8080 端口。
  • 當客戶端連接時,會觸發 connection 事件。
  • 當服務器接收到客戶端發送的消息時,它會廣播該消息給所有其他已連接的客戶端。
  • wss.clients.forEach 用來遍歷所有連接的客戶端并發送消息。

3. 啟動 WebSocket 服務器

運行服務器:

node websocket-server.js

啟動成功終端會出現以下字樣:

WebSocket 服務器啟動,監聽 8080 端口...

服務器啟動后,就可以通過 WebSocket 客戶端與其建立連接了。


WebSocket 客戶端實現

接下來,我們在前端實現 WebSocket 客戶端。我們將使用原生 JavaScript 來連接 WebSocket 服務器,并實現消息的發送與接收。

1. 創建 HTML 頁面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>WebSocket 聊天應用</title><style>#messages { height: 300px; overflow-y: auto; border: 1px solid #ddd; padding: 10px; }input, button { width: 100%; padding: 10px; margin-top: 10px; }</style>
</head>
<body><h2>WebSocket 聊天應用</h2><div id="messages"></div><input type="text" id="messageInput" placeholder="輸入消息..."><button id="sendMessageBtn">發送</button><script> ... </script>
</body>
</html>
<script>const socket = new WebSocket('ws://localhost:8080'); // 連接 WebSocket 服務器const messagesDiv = document.getElementById('messages');const messageInput = document.getElementById('messageInput');const sendMessageBtn = document.getElementById('sendMessageBtn');// 當 WebSocket 連接成功時socket.onopen = function() {console.log('WebSocket 連接已建立');};// 當接收到服務器的消息時socket.onmessage = function (event) {// 檢查數據類型是否為Blobif (event.data instanceof Blob) {// 將Blob轉換為文本const reader = new FileReader();reader.onload = function () {const message = reader.result;displayMessage(message);};reader.readAsText(event.data);} else {// 如果是文本直接使用const message = event.data;displayMessage(message);}};// 單獨的消息顯示函數function displayMessage(message) {const messageElement = document.createElement('div');messageElement.textContent = message;messagesDiv.appendChild(messageElement);messagesDiv.scrollTop = messagesDiv.scrollHeight; // 滾動到最新消息}// 當 WebSocket 出現錯誤時socket.onerror = function(error) {console.log('WebSocket 錯誤: ', error);};// 當 WebSocket 連接關閉時socket.onclose = function() {console.log('WebSocket 連接已關閉');};// 點擊發送按鈕時發送消息sendMessageBtn.onclick = function() {const message = messageInput.value;if (message) {socket.send(message);messageInput.value = ''; // 清空輸入框}};</script>

在這個 HTML 頁面中:

  • 我們創建了一個簡單的聊天界面,包含一個用于顯示消息的 div 和一個輸入框與按鈕,用于輸入和發送消息。
  • 使用 WebSocket 對象與后端 WebSocket 服務器建立連接,并在 onmessage 事件中接收消息并展示。
  • 點擊“發送”按鈕時,輸入的消息將通過 WebSocket 發送到服務器。

2. 測試客戶端與服務器

打開瀏覽器,打開這個 HTML 頁面,打開多個標簽頁,可以看到多個客戶端可以實時接收到其他客戶端發送的消息。
在這里插入圖片描述
從打開兩個網頁客戶端相互發消息到關閉頁面,在終端會顯示以下內容:

客戶端已連接
客戶端已連接
收到消息:  <Buffer e4 bd a0 e5 a5 bd ef bc 81 e4 bb 8a e5 a4 a9 e6 98 9f e6 9c 9f e5 87 a0 ef bc 9f>
收到消息:  <Buffer e4 bd a0 e5 a5 bd ef bc 8c e4 bb 8a e5 a4 a9 e6 98 9f e6 9c 9f e4 b8 80 e3 80 82>
客戶端斷開連接
客戶端斷開連接

實時聊天應用示例

通過上面的代碼,您已經完成了一個簡單的實時聊天應用。每當一個客戶端發送消息時,其他所有客戶端都能立刻收到這條消息。這就是 WebSocket 的魅力所在——它為實時通信提供了便捷、低延遲的解決方案。

通過這個簡單的聊天應用,我們實現了:

  • 消息的發送與接收:客戶端可以發送消息,服務器將其廣播給其他客戶端。
  • 實時更新:消息的接收是即時的,確保了實時的溝通效果。

常見問題與解決方案

  1. 無法連接 WebSocket 服務器
    • 確保服務器正在運行,并且監聽正確的端口。
    • 確認客戶端使用的 WebSocket URL 正確,例如 ws://localhost:8080
  2. 消息不接收
    • 檢查 WebSocket 連接是否成功(查看瀏覽器控制臺中的 onopenonmessage 輸出)。
    • 確認消息是否通過 socket.send() 正確發送。
  3. WebSocket 連接斷開
    • 確保 WebSocket 連接沒有被防火墻或代理阻止。
    • 使用 onclose 事件監聽連接關閉,并實現重連機制。

小結

  1. 本篇文章通過一個簡單的實時聊天應用,展示了如何在前端和后端使用 WebSocket 實現實時消息傳輸。
  2. 通過搭建 WebSocket 服務器和客戶端,我們實現了一個簡單的聊天系統,數據可以實時傳輸到多個客戶端。
  3. WebSocket 為實時應用提供了高效的解決方案,適用于聊天、游戲、實時推送等場景。

🔔 下一篇文章,我們將進入 WebSocket 的性能優化,講解如何提高 WebSocket 在高并發下的性能和穩定性。

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

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

相關文章

CentOS 8-BClinux8.2更換為阿里云鏡像源:保姆級教程

還在為 CentOS 8 官方源訪問緩慢或不可用而煩惱嗎&#xff1f;更換為國內鏡像源&#xff0c;如阿里云&#xff0c;可以顯著提升軟件包下載速度和穩定性。本文將帶你一步步完成 CentOS 8 鏡像源的更換&#xff0c;讓你的系統管理更順暢。 準備工作 在進行任何系統配置更改之前…

MySQL中InnoDB索引使用與底層原理

MySQL Server端的緩存&#xff08;查詢緩存&#xff09;是MySQL Server層的特性&#xff0c;而InnoDB的緩存&#xff08;緩沖池&#xff09;是InnoDB存儲引擎層的特性。兩者是完全獨立的。下面我們來深入探討這兩者以及InnoDB索引的原理。1. MySQL Server層的緩存 - 查詢緩存 (…

Python實戰:實現監測抖音主播是否開播并錄屏

實現這個功能,主要思路是循環檢查主播狀態 → 開播后獲取直播流地址 → 使用FFmpeg錄制。下面是一個基本的步驟表格: 步驟 關鍵行動 常用工具/庫 1 獲取主播直播間ID或唯一標識 瀏覽器開發者工具、抓包工具1 2 循環請求抖音API,查詢主播直播狀態 requests, time 3 解析API響…

init / record / required:讓 C# 對象一次成型

標簽&#xff1a; init record required with表達式 不可變性 數據模型 DTO 目錄1. init 訪問器&#xff1a;讓不可變對象的創建更靈活1.1. 概念1.1.1. 語法1.1.2. 語義1.2. 設計初衷&#xff1a;解決什么問題&#xff1f;1.3. 使用方法1.3.1. 在對象初始化器中賦值&#xff08…

每天五分鐘深度學習:神經網絡的權重參數如何初始化

本文重點 在邏輯回歸的時候,我們可以將神經網絡的權重參數初始化為0(或者同樣的值),但是如果我們將神經網絡的權重參數初始化為0就會出問題,上節課程我們已經進行了簡單的解釋,那么既然初始化為0不行,神經網絡該如何進行參數初始化呢?神經網絡的權重參數初始化是模型訓…

[論文閱讀] 告別“數量為王”:雙軌道會議模型+LS,破解AI時代學術交流困局

告別“數量為王”&#xff1a;雙軌道會議模型LS&#xff0c;破解AI時代學術交流困局 論文信息信息類別具體內容論文原標題From Passive to Participatory: How Liberating Structures Can Revolutionize Our Conferences主要作者及機構1. Daniel Russo&#xff08;丹麥奧爾堡大…

趣味學solana(介紹)

你就是那個關鍵的“守門員”&#xff01; 為了方便理解Solana&#xff0c;我們把Solana 想象成一個巨大的、24小時不停歇的足球聯賽。成千上萬的足球運動員&#xff08;用戶&#xff09;在不停地傳球、射門&#xff08;發送交易&#xff09;&#xff0c;而整個比賽的結果必須被…

分布式事務性能優化:從故障現場到方案落地的實戰手記(三)

第三部分&#xff1a;混合場景攻堅——從“單點優化”到“系統協同” 有些性能問題并非單一原因導致&#xff0c;而是鎖競爭與事務耗時共同作用的結果。以下2個案例&#xff0c;展示綜合性優化策略。 案例7&#xff1a;基金申購的“TCC性能陷阱”——從全量預留到增量確認 故障…

規則系統架構風格

考題 某公司擬開發一個VIP管理系統,系統需要根據不同商場活動,不定期更新VIP會員的審核標準和VIP折扣系統。針對上述需求,采用(__)架構風格最為合適。 A. 規則系統 B. 管道-過濾器風格 C. 事件驅動 D. 分層 一、什么是規則系統架構風格? 規則系統架構風格是一種將應…

kubeadm搭建生產環境的單master多node的k8s集群

k8s環境規劃: podSubnet&#xff08;pod 網段&#xff09; 10.20.0.0/16 serviceSubnet&#xff08;service 網段&#xff09;: 10.10.0.0/16 實驗環境規劃: 操作系統&#xff1a;centos7.9 配置&#xff1a; 4G 內存/4核CPU/40G 硬盤 網絡&#xff1a;NAT K8s集群角色ip主…

React Device Detect 完全指南:構建響應式跨設備應用的最佳實踐

前言 在現代 Web 開發中&#xff0c;設備檢測是一個至關重要的功能。不同的設備&#xff08;手機、平板、桌面&#xff09;有著不同的屏幕尺寸、交互方式和性能特點&#xff0c;因此需要針對性地提供不同的用戶體驗。react-device-detect 是一個專門為 React 應用設計的設備檢…

Spark專題-第一部分:Spark 核心概述(2)-Spark 應用核心組件剖析

這一篇依然是偏理論向的內容&#xff0c;用兩篇理論搭建起Spark的框架&#xff0c;讓讀者有個基礎的認知&#xff0c;下一篇就可以開始sql的內容了 第一部分&#xff1a;Spark 核心概述&#xff08;2&#xff09; Spark 應用核心組件剖析 1. Job, Stage, Task 的三層架構 理解 …

KMP 字符串hash算法

kmp算法 最大相同真前后綴&#xff1a; 如 ababa的最大真前后綴為aba&#xff0c; 而不是ababa&#xff08;真前后綴與真子集類似&#xff0c;不可是本身&#xff0c;不然沒意義&#xff09; 所以next[1] 0&#xff1b;//string的下標從1開始 kmp模擬 next初始化&#xff…

HOT100--Day22--74. 搜索二維矩陣,34. 在排序數組中查找元素的第一個和最后一個位置,33. 搜索旋轉排序數組

HOT100–Day22–74. 搜索二維矩陣&#xff0c;34. 在排序數組中查找元素的第一個和最后一個位置&#xff0c;33. 搜索旋轉排序數組 每日刷題系列。今天的題目是《力扣HOT100》題單。 題目類型&#xff1a;二分查找。 關鍵&#xff1a; 今天的題目都是“多次二分” 74題&#xf…

Java分布式鎖實戰指南:從理論到實踐

Java分布式鎖實戰指南&#xff1a;從理論到實踐 前言 在分布式系統中&#xff0c;傳統的單機鎖機制無法滿足跨進程、跨機器的同步需求。分布式鎖應運而生&#xff0c;成為保證分布式系統數據一致性的關鍵技術。本文將全面介紹Java中分布式鎖的實現方式和最佳實踐。 1. 分布式鎖…

(二叉樹) 本節目標 1. 掌握樹的基本概念 2. 掌握二叉樹概念及特性 3. 掌握二叉樹的基本操作 4. 完成二叉樹相關的面試題練習

二叉樹1. 樹型結構&#xff08;了解&#xff09;1.1 概念1.2 概念&#xff08;重要&#xff09;1.3 樹的表示形式&#xff08;了解&#xff09;1.4 樹的應用2. 二叉樹&#xff08;重點&#xff09;2.1 概念2.2 兩種特殊的二叉樹2.3 二叉樹的性質2.4 二叉樹的存儲2.5 二叉樹的基…

【Zephyr電源與功耗專題】13_PMU電源驅動介紹

文章目錄前言一、PMU系統介紹二、Zephyr系統下驅動PMU的組成2.1&#xff1a;PMU系統在Zephyr上包括五大部分&#xff1a;2.2&#xff1a;功能說明2.3&#xff1a;B-core功能說明(Freertos)三、PMU各驅動API詳解3.1:Power_domain3.1.1&#xff1a;初始化3.1.2&#xff1a;rpmsg回…

華清遠見25072班網絡編程學習day5

作業0> 將IO多路復用實現TCP并發服務器實現一遍程序源碼&#xff1a;#include <25072head.h> #define SER_IP "192.168.153.128" //服務器ip地址 #define SER_PORT 8888 //服務器端口號 int main(int argc, const char *argv[]) {//1、創建一個…

【數據結構--順序表】

順序表和鏈表 1.線性表&#xff1a; 線性表是n個具有相同特性&#xff08;相同邏輯結構&#xff0c;物理結構&#xff09;的數據元素的有限序列。常見的線性表有&#xff1a;順序表&#xff0c;鏈表&#xff0c;棧&#xff0c;隊列&#xff0c;字符串…線性表在邏輯上是線性結構…

【PyTorch】圖像多分類部署

如果需要在獨立于訓練腳本的新腳本中部署模型&#xff0c;這種情況模型和權重在內存中不存在&#xff0c;因此需要構造一個模型類的對象&#xff0c;然后將存儲的權重加載到模型中。加載模型參數&#xff0c;驗證模型的性能&#xff0c;并在測試數據集上部署模型from torch imp…