認識并理解webSocket

今天逛牛客,看到有大佬分享說前端面試的時候遇到了關于webSocket的問題,一看自己都沒見過這個知識點,趕緊學習一下,在此記錄!

WebSocket 是一種網絡通信協議,提供了全雙工通信渠道,即客戶端和服務器可以同時發送和接收數據。這與傳統的HTTP請求不同,后者是單向的,客戶端發起請求,服務器響應請求。WebSocket 允許服務器主動向客戶端發送消息,這使得實時通信成為可能,例如在線聊天應用、實時游戲、股票行情更新等場景。

WebSocket 的基本概念

  1. 連接建立:客戶端通過發送一個HTTP請求來發起WebSocket連接,這個請求中包含特定的頭部,表明這是一個WebSocket握手請求。
  2. 握手:服務器接收到請求后,如果支持WebSocket,則響應一個HTTP響應,完成握手過程,建立WebSocket連接。
  3. 數據傳輸:一旦連接建立,客戶端和服務器就可以通過這個連接發送數據。數據可以是文本或二進制格式。
  4. 連接關閉:任何一方都可以關閉WebSocket連接。

WebSocket 的使用步驟

  1. 創建WebSocket實例:在客戶端,首先需要創建一個WebSocket實例,指定服務器的URL。

    const ws = new WebSocket('ws://example.com/socket');
    
  2. 處理連接事件:當WebSocket連接建立時,會觸發open事件。

    ws.onopen = function(event) {console.log('WebSocket connection opened:', event);
    };
    
  3. 發送數據:使用send方法向服務器發送數據。

    ws.send('Hello Server!');
    
  4. 接收數據:服務器發送的數據可以通過message事件接收。

    ws.onmessage = function(event) {console.log('Message from server:', event.data);
    };
    
  5. 處理錯誤和關閉連接:WebSocket連接可能會遇到錯誤,或者需要主動關閉。

    ws.onerror = function(error) {console.error('WebSocket Error:', error);
    };ws.onclose = function(event) {console.log('WebSocket connection closed:', event);
    };// 可以主動關閉連接
    ws.close();
    

使用nodejs實現一個簡單的在線聊天demo。

客戶端代碼
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><!-- 簡單的HTML界面 -->
<textarea id="messageInput" placeholder="Type a message..."></textarea>
<button id="sendButton">Send</button>
<div id="messages"></div><script>// 綁定按鈕點擊事件document.getElementById('sendButton').addEventListener('click', sendMessage);// 創建WebSocket連接const ws = new WebSocket('ws://localhost:8080');const messageInput = document.getElementById('messageInput');const messagesDiv = document.getElementById('messages');const sendButton = document.getElementById('sendButton');// 連接打開時觸發ws.onopen = function(event) {console.log('Connected to the server');// 可以在這里禁用或啟用按鈕等sendButton.disabled = false;};// 接收到消息時觸發ws.onmessage = function(event) {// 將接收到的消息添加到消息顯示區域const messageElement = document.createElement('div');messageElement.textContent = event.data;messagesDiv.appendChild(messageElement);// 滾動到消息區域底部messagesDiv.scrollTop = messagesDiv.scrollHeight;};// 發送消息的函數function sendMessage() {if (ws.readyState === WebSocket.OPEN) {const message = messageInput.value;if (message) { // 確保消息不為空ws.send(message);messageInput.value = ''; // 清空輸入框}} else {console.error('WebSocket is not connected. Cannot send message.');}}// 客戶端連接錯誤時觸發ws.onerror = function(error) {console.error('WebSocket error observed:', error);// 可以在這里顯示錯誤信息或禁用發送按鈕sendButton.disabled = true;};// 客戶端關閉連接時觸發ws.onclose = function(event) {console.log('WebSocket connection closed:', event);// 可以在這里禁用發送按鈕或顯示斷開連接的信息sendButton.disabled = true;};
</script>
</body>
</html>
服務端代碼

(注意要先使用npm install ws命令安裝需要的庫)

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });// 存儲所有客戶端的集合
const clients = new Set();wss.on('connection', function connection(ws) {console.log('Client connected');// 將新的客戶端WebSocket對象添加到集合中clients.add(ws);ws.on('message', function incoming(message) {console.log('received: %s', message);});ws.on('close', function() {console.log('Client disconnected');// 從集合中移除客戶端clients.delete(ws);});// 可以在這里發送歡迎消息給新連接的客戶端ws.send('Welcome to the chat!');
});// 假設我們有一個函數,用來向所有客戶端廣播消息
function broadcastMessage(message) {clients.forEach(client => {if (client.readyState === WebSocket.OPEN) {client.send(message);}});
}// 示例:每隔5秒向所有客戶端發送當前時間
setInterval(() => {const currentTime = new Date().toLocaleTimeString();broadcastMessage(`Current time: ${currentTime}`);
}, 5000);
實現效果

客戶端向服務端發送消息:

在這里插入圖片描述
在這里插入圖片描述
服務端向客戶端發送消息:
每隔五秒發送當前的時間
在這里插入圖片描述

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

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

相關文章

策略為王股票軟件源代碼-----如何修改為自己軟件61----資訊菜單修改-----舉例---------調用同花順網頁------

http://stock.sina.com.cn 將原來的新浪行情,修改為同花順, 搜索 stock.sina.com.cn... StkUI\View\InfoView.cpp(58):char

AI防損員的應用:正確率高達90%背后的真相與挑戰

1. AI防損員的工作原理 AI防損員利用圖像識別技術來判斷商超中的行為是否異常。它將所有觀察到的行為分為兩類&#xff1a;正常行為和異常行為。這是一種二分類問題。 2. 數據不平衡問題 在現實中的商超環境中&#xff0c;正常行為占絕大多數&#xff0c;異常行為&#xff08;…

MySQL——備份

為什么要備份&#xff1f; 保證重要的數據不丟失 方便數據轉移 MySQL數據庫備份方式&#xff1a; 1. 直接拷貝物理文件 2. 在可視化工具中手動導出 —— 在想要導出的表或者庫中&#xff0c;右鍵選擇備份或導出 3. 使用命令行導出 mysqldump ——cmd打開命令行 —…

Python實現Mybatis Plus

Python實現Mybatis Plus from flask import g from sqlalchemy import asc, descclass QueryWrapperBuilder:conditions {}order_by_info {}def __new__(cls, *args, **kwargs):obj super(QueryWrapperBuilder, cls).__new__(cls)return objdef __init__(self, obj):self.o…

論文閱讀--Simple Baselines for Image Restoration

這篇文章是 2022 ECCV 的一篇文章&#xff0c;是曠視科技的一篇文章&#xff0c;針對圖像恢復任務各種網絡結構進行了梳理&#xff0c;最后總結出一種非常簡單卻高效的網絡結構&#xff0c;這個網絡結構甚至不需要非線性激活函數。 文章一開始就提到&#xff0c;雖然在圖像復原…

VRPTW(MATLAB):常春藤算法(IVY)求解帶時間窗的車輛路徑問題VRPTW,MATLAB代碼

詳細介紹 VRPTW&#xff08;MATLAB&#xff09;&#xff1a;常春藤算法&#xff08;Ivy algorithm&#xff0c;IVY&#xff09;求解帶時間窗的車輛路徑問題VRPTW&#xff08;提供MATLAB代碼&#xff09;-CSDN博客 ********************************求解結果******************…

EtherCAT轉Profinet網關配置說明第一講:配置軟件安裝及介紹

網關XD-ECPNS20為EtherCAT轉Profinet協議網關&#xff0c;使EtherCAT協議和Profinet協議兩種工業實時以太網網絡之間雙向傳輸 IO 數據。適用于具有EtherCAT協議網絡與Profinet協議網絡跨越網絡界限進行數據交換的解決方案。 本網關通過上位機來進行配置。 首先安裝上位機軟件 一…

Qt使用sqlite數據庫及項目實戰

一.sqlite使用介紹 在Qt中使用SQLite數據庫非常簡單&#xff0c;SQLite是一個輕量級的嵌入式數據庫&#xff0c;不需要單獨的數據庫服務器&#xff0c;完全使用本地文件來存儲數據。 當在Qt中使用SQLite數據庫時&#xff0c;需要涉及到一些SQL語句以及Qt中的相關函數&#xf…

【海賊王的數據航海】ST表——RMQ問題

目錄 1 -> RMQ問題 1.1 -> 定義 1.2 -> 解決策略 2 -> ST表 2.1 -> 定義 2.2 什么是可重復貢獻問題 2.3 -> 預處理ST表 2.4 -> 處理查詢 2.5 -> 實際問題 1 -> RMQ問題 1.1 -> 定義 RMQ (Range Minimum/Maximum Query)即區間最值查詢…

Go 語言多版本管理的最佳實踐 —— Linux 和 Windows 專題20240702

Go 語言多版本管理的最佳實踐 —— Linux 和 Windows 專題 引言 在軟件開發的世界里&#xff0c;保持開發環境的最新和兼容至關重要。特別是 Go 語言&#xff0c;隨著版本的更新&#xff0c;不同項目可能需要不同的 Go 版本。這時&#xff0c;如何在同一臺機器上高效管理多個…

黑馬點評DAY2|Redis基本操作

Redis客戶端 命令行客戶端 進入到redis的安裝目錄&#xff0c;可以看到redis-cli文件&#xff0c;這就是redis的命令行客戶端&#xff0c;在安裝redis時自帶的。 使用方式如下 redis-cli [options] [commonds]其中常見的options有&#xff1a; -h 127.0.0.1 &#xff1a;指…

電量監測與電量計基礎知識

硬件之路學習筆記 ?-----前文導讀----- ①、公眾號主頁點擊發消息 ②、點擊下方菜單獲取系列文章 -----本文簡介----- 主要內容包括&#xff1a; ①&#xff1a;簡介 ②&#xff1a;省成本方式-電阻分壓 ③&#xff1a;精確方式-電量計與阻抗跟蹤技術 ----- 正文 ----…

Hugging face Transformers(1)—— 基礎知識

Hugging Face 是一家在 NLP 和 AI 領域具有重要影響力的科技公司&#xff0c;他們的開源工具和社區建設為NLP研究和開發提供了強大的支持。它們擁有當前最活躍、最受關注、影響力最大的 NLP 社區&#xff0c;最新最強的 NLP 模型大多在這里發布和開源。該社區也提供了豐富的教程…

JavaWeb--jquery篇

概述 jQuery是一個快速、簡潔的JavaScript框架&#xff0c;是一個優秀的JavaScript代碼庫&#xff08;框架&#xff09;于2006年1月由John Resig發布。它封裝JavaScript常用的功能代碼&#xff0c;提供一種簡便的JavaScript設計模式&#xff0c;優化HTML文檔操作、事件處理、動…

2229:Sumsets

網址如下&#xff1a; OpenJudge - 2229:Sumsets 這題不是我想出來的 在這里僅做記錄 代碼如下&#xff1a; #include<iostream> using namespace std;const int N 1000000000; int dp[1000010]; int n;int main() {cin >> n;dp[0] 1;dp[1] 1;for (int i 2…

前端面試題7(單點登錄)

如何實現單點登錄 單點登錄&#xff08;Single Sign-On&#xff0c;簡稱SSO&#xff09;是一種允許用戶在多個應用系統中只需登錄一次&#xff0c;就可以訪問所有相互信任的應用系統的認證技術。實現前端單點登錄主要依賴于后端的支持和一些特定的協議&#xff0c;如OAuth、Ope…

無法下載cuda

cuda下載不了 一、臺式機電腦瀏覽器打不開cuda下載下面二、解決辦法 一、臺式機電腦瀏覽器打不開cuda下載下面 用360、chrome、Edge瀏覽器都打不開下載頁面&#xff0c;有的人說后綴com改成cn&#xff0c;都不行。知乎上說是網絡問題&#xff0c;電信換成換成移動/聯通的網絡會…

Selenium 切換 frame/iframe

環境&#xff1a; Python 3.8 selenium3.141.0 urllib31.26.19說明&#xff1a; driver.switch_to.frame() # 將當前定位的主體切換為frame/iframe表單的內嵌頁面中 driver.switch_to.default_content() # 跳回最外層的頁面# 判斷元素是否在 frame/ifame 中 # 126 郵箱為例 # …

無人機云臺類型及作用

無人機云臺主要分為三種類型&#xff1a; 單軸云臺&#xff1a;僅支持單向旋轉&#xff0c;適合拍攝平滑的延時攝影和全景照片。 雙軸云臺&#xff1a;支持水平和垂直旋轉&#xff0c;可用于拍攝流暢的視頻和運動物體。 三軸云臺&#xff1a;全面支持所有旋轉軸&#xff0c;…

醫院陪診系統開發的關鍵技術與挑戰

隨著醫療服務需求的不斷提升&#xff0c;傳統的醫院服務模式面臨著巨大的壓力和挑戰。為了提升患者的就醫體驗和醫療服務的效率&#xff0c;醫院陪診系統應運而生。本文將探討醫院陪診系統開發的關鍵技術與挑戰&#xff0c;并結合具體的技術代碼進行分析。 一、醫院陪診系統的…