在 .NET Core 和 React 中使用 WebSockets 和 SignalR 進行實時數據傳輸

對于需要即時更新和通知的應用程序來說,實時數據傳輸至關重要。在 .NET Core 中,WebSocket 和 SignalR 提供了強大的工具來實現客戶端和服務器之間的實時通信。在本指南中,我們將探討如何在 .NET Core 應用程序中使用 WebSocket 和 SignalR 實現實時數據傳輸。

什么是 WebSockets 和 SignalR?

WebSockets:

WebSockets 是一種通過單個 TCP 連接提供全雙工通信通道的協議。它支持客戶端和服務器之間的雙向通信,允許異步發送和接收數據,而無需 HTTP 輪詢的開銷。

為什么選擇 WebSocket?

?? ?1、實時通信:WebSockets 支持實時數據傳輸,使其成為需要即時更新的應用程序的理想選擇,例如聊天應用程序、實時儀表板和在線游戲平臺。

?? ?2、效率:與傳統的 HTTP 輪詢或長輪詢技術不同,WebSocket 通過維持持久連接、最大限度地減少延遲和減少網絡流量來降低開銷。

?? ?3、全雙工通信:WebSocket 支持雙向同時傳輸數據,允許客戶端和服務器獨立發送和接收消息。

?? ?4、可擴展性:WebSockets 可以高效處理大量并發連接,適用于可擴展和高性能的應用程序。

WebSockets 的替代方案:

雖然 WebSocket 廣泛用于實時通信,但有幾種替代方案也提供類似的功能:

?? ?1、服務器發送事件 (SSE):SSE 是一種單向通信協議,允許服務器通過 HTTP 連接向客戶端推送更新。與 WebSocket 不同,SSE 僅限于服務器到客戶端的通信,不支持雙向通信。

?? ?2、長輪詢:長輪詢是一種客戶端向服務器發送請求的技術,服務器會保持連接打開,直到有新數據可用或發生超時。雖然長輪詢可以實現實時更新,但由于頻繁建立和關閉連接,其效率低于 WebSocket。

WebSockets 的優點和缺點:

優點:
? 實時更新:WebSockets 支持實時通信,為客戶端提供即時更新。
? 效率:與輪詢技術相比,WebSocket 減少了延遲和網絡開銷。
? 全雙工通信:支持雙向數據傳輸,允許客戶端和服務器同時發送和接收消息。
? 可擴展性:WebSockets 可以高效處理大量并發連接,適合可擴展的應用程序。

缺點:
? 復雜性:實現和管理 WebSocket 連接比傳統的 HTTP 通信更復雜。
? 瀏覽器支持:雖然現代瀏覽器支持 WebSockets,但舊版瀏覽器可能不支持,因此需要回退機制或其他方法。
? 防火墻問題:WebSockets 可能會面臨限制性防火墻或阻止 WebSocket 流量的代理服務器的問題。

SignalR:

SignalR 是一個基于 WebSocket(以及其他傳輸機制)構建的高級庫,可簡化 .NET 應用程序中的實時 Web 功能。它抽象了管理連接的復雜性,并提供了一個簡單的 API 用于向客戶端廣播消息并處理客戶端與服務器之間的通信。

為什么選擇 SignalR?

?? ?1、簡化開發:SignalR 簡化了管理 WebSocket 連接的復雜性,并提供了一個簡單的 API 來實現 .NET 應用程序中的實時功能。它負責連接管理、消息路由和錯誤處理,使開發人員能夠專注于應用程序邏輯。

?? ?2、跨平臺支持:SignalR 支持服務器端 .NET 應用程序和客戶端 JavaScript 框架,使其適合在 Web 應用程序、桌面應用程序和移動應用程序中構建實時功能。

?? ?3、可擴展性:SignalR 旨在隨您的應用程序擴展,支持大量并發連接,并提供擴展到多臺服務器或使用基于云的解決方案(如 Azure SignalR 服務)的選項。

?? ?4、回退機制:對于不支持 WebSocket 的客戶端,SignalR 會自動回退到替代傳輸機制,例如服務器發送事件 (SSE) 或長輪詢,確保跨瀏覽器和設備的廣泛兼容性。

SignalR 的替代方案:

雖然 SignalR 是 .NET 應用程序中實時 Web 功能的熱門選擇,但也有幾種替代方案提供類似的功能:

?? ?1、原始 WebSocket API:開發人員可以使用 .NET 或其他編程語言提供的原始 WebSocket API 來實現實時通信,而無需 SignalR 提供的抽象。但是,這種方法需要更多的手動配置,對開發人員來說可能不太方便。

?? ?2、第三方庫:有一些第三方庫可用于在 .NET 應用程序中實現實時通信,例如 .NET 的 Socket.IO 或 Fleck。這些庫提供了額外的功能和靈活性,但可能需要付出更多努力來集成和維護。

SignalR 的優點和缺點:

優點:
? 簡化開發:SignalR 提供了用于實現實時功能的高級 API,減少了開發時間和復雜性。
? 跨平臺支持:SignalR 支持廣泛的客戶端,包括 Web 瀏覽器、桌面應用程序和移動設備。
? 可擴展性:SignalR 旨在隨您的應用程序擴展,支持大量并發連接并提供擴展到多臺服務器的選項。
? 回退機制:對于不支持 WebSockets 的客戶端,SignalR 會自動回退到替代傳輸機制,確保廣泛的兼容性。

缺點:
? 對 .NET Framework/Core 的依賴:SignalR 與 .NET 生態系統緊密耦合,因此不太適合使用其他技術構建的應用程序。
? 性能開銷:雖然 SignalR 簡化了開發,但與原始 WebSocket 實現相比,它可能會帶來一些性能開銷。
? 復雜性:SignalR 抽象了一些實時通信的復雜性,但在復雜場景中可能仍然需要額外的配置和故障排除。

為什么要使用實時數據傳輸?

實時數據傳輸對于需要實時更新的應用程序至關重要,例如:

?? ?? 聊天應用程序
? 實時儀表板和監控系統
? 協作文檔編輯工具
? 在線游戲平臺
? 股票市場跟蹤應用程序
? 現場體育記分牌

在 .NET Core 中使用 SignalR 實現

步驟1:安裝 SignalR

使用 NuGet 包管理器安裝 SignalR 包:

otnet add package Microsoft.AspNetCore.SignalRadd package Microsoft.AspNetCore.SignalR

步驟2:創建 SignalR Hub

創建一個 SignalR 中心來管理客戶端連接并處理消息廣播。

using Microsoft.AspNetCore.SignalR;
using System.Threading.Tasks;

public class ChatHub : Hub
{
public async Task SendMessage(string user, string message)
{
await Clients.All.SendAsync("ReceiveMessage", user, message);
}
}

步驟3:在啟動中配置 SignalR

在 Startup 類中配置 SignalR 以啟用 WebSocket 支持并映射集線器端點。

public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseRouting();

? ? app.UseEndpoints(endpoints =>
{
endpoints.MapHub<ChatHub>("/chatHub");
});
}

步驟 4:客戶端集成

在客戶端集成SignalR以建立連接并接收實時更新。

<!DOCTYPE html>
<html>
<head>
<title>SignalR Chat</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/signalr/5.0.0/signalr.min.js"></script>
</head>
<body>
<div id="messages"></div>
<input type="text" id="messageInput" />
<button onclick="sendMessage()">Send</button>

? ? <script>
const connection = new signalR.HubConnectionBuilder()
.withUrl("/chatHub")
.build();

? ? ? ? connection.on("ReceiveMessage", (user, message) => {
document.getElementById("messages").innerHTML += `<p><strong>${user}</strong>: ${message}</p>`;
});

? ? ? ? connection.start().then(() => {
console.log("Connected to SignalR hub");
}).catch((err) => {
console.error("Error connecting to SignalR hub:", err);
});

? ? ? ? function sendMessage() {
const user = "User"; // Get user from input
const message = document.getElementById("messageInput").value;
connection.invoke("SendMessage", user, message);
}
</script>
</body>
</html>

讓我們擴展這個示例,包括接收來自客戶端的消息并提供包含后端和前端代碼的端到端解決方案。

后端:帶有 SignalR 的 ASP.NET Core Web API

步驟 1:創建 SignalR Hub

創建一個 SignalR 中心來管理客戶端連接并處理消息廣播。

using Microsoft.AspNetCore.SignalR;
using System.Threading.Tasks;

public class ChatHub : Hub
{
public async Task SendMessage(string user, string message)
{
await Clients.All.SendAsync("ReceiveMessage", user, message);
}

? ? public void ReceiveMessage(string user, string message)
{
// Handle received message (e.g., save to database, process, etc.)
}
}

步驟2:在啟動中配置 SignalR

在 Startup 類中配置 SignalR 以啟用 WebSocket 支持并映射集線器端點。

public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseRouting();

? ? app.UseEndpoints(endpoints =>
{
endpoints.MapHub<ChatHub>("/chatHub");
});
}

步驟3:創建用于接收消息的控制器

創建一個控制器來處理來自客戶端的傳入消息。

using Microsoft.AspNetCore.Mvc;

[Route("api/[controller]")]
[ApiController]
public class ChatController : ControllerBase
{
private readonly IHubContext<ChatHub> _hubContext;

? ? public ChatController(IHubContext<ChatHub> hubContext)
{
_hubContext = hubContext;
}

? ? [HttpPost("ReceiveMessage")]
public async Task<IActionResult> ReceiveMessage(string user, string message)
{
await _hubContext.Clients.All.SendAsync("ReceiveMessage", user, message);
return Ok();
}
}

前端:使用 SignalR 的 React UI

步驟1:安裝 SignalR 客戶端庫

使用 npm 安裝 JavaScript 的 SignalR 客戶端庫。

npm install @microsoft/signalr

步驟2:創建WebSocket連接

創建與 SignalR 集線器的 WebSocket 連接并處理傳入消息。

import React, { useState, useEffect } from 'react';
import * as signalR from '@microsoft/signalr';

const Chat = () => {
const [messages, setMessages] = useState([]);
const [connection, setConnection] = useState(null);

? ? useEffect(() => {
const newConnection = new signalR.HubConnectionBuilder()
.withUrl("/chatHub")
.build();

? ? ? ? newConnection.on("ReceiveMessage", (user, message) => {
setMessages([...messages, { user, message }]);
});

? ? ? ? newConnection.start()
.then(() => console.log("Connected to SignalR hub"))
.catch(error => console.error("Error connecting to SignalR hub:", error));

? ? ? ? setConnection(newConnection);
}, []);

? ? const sendMessage = () => {
const user = "User"; // Get user from input
const message = "Hello, SignalR!"; // Get message from input
connection.invoke("SendMessage", user, message)
.catch(error => console.error("Error sending message:", error));
};

? ? return (
<div>
<div>
{messages.map((message, index) => (
<div key={index}>
<strong>{message.user}</strong>: {message.message}
</div>
))}
</div>
<input type="text" />
<button onClick={sendMessage}>Send</button>
</div>
);
};

export default Chat;

總結

????????在本指南中,我們探討了如何在 .NET Core 應用程序中使用 WebSocket 和 SignalR 實現實時數據傳輸。利用 SignalR,您可以輕松實現客戶端和服務器之間的實時通信,使其成為構建交互式協作 Web 應用程序的理想選擇。無論您是構建聊天應用程序、實時儀表板還是多人游戲,SignalR 都能提供向用戶提供實時更新所需的工具。

????????我們演示了如何在 .NET Core 后端和 React 前端使用 SignalR 實現實時消息傳遞。用戶可以從前端發送消息,然后由后端 SignalR 中心接收并廣播到所有連接的客戶端。這種端到端解決方案為 Web 應用程序提供了無縫的實時消息傳遞體驗。

如果您喜歡此文章,請收藏、點贊、評論,謝謝,祝您快樂每一天。

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

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

相關文章

第八十六篇 大數據排序算法:從廚房整理到分布式排序的智慧

目錄一、基礎排序算法&#xff1a;生活場景中的計算智慧1.1 冒泡排序&#xff1a;圖書館的書籍整理1.2 插入排序&#xff1a;廚房調料的整理藝術二、高效排序算法&#xff1a;大數據處理的利器2.1 快速排序&#xff1a;音樂APP的智能歌單2.2 歸并排序&#xff1a;學校成績單的合…

開源 | V3.1.1慧知開源重卡運營充電樁平臺 - 重卡運營充電樁平臺管理解決方案;企業級完整代碼 多租戶、模擬器、多運營商、多小程序;

【開源免費版】推薦一套企業級開源充電樁平臺&#xff1a;完整代碼包含多租戶、硬件模擬器、多運營商、多小程序&#xff0c;汽車 電動自行車、云快充協議&#xff1b;——(慧哥)慧知開源充電樁平臺&#xff1b;https://liwenhui.blog.csdn.net/article/details/148242725?spm…

ONLYOFFICE 協作空間 企業版使用秘籍-8.使用虛擬數據房間,處理機密文檔更安全

在當今快節奏的社會中&#xff0c;信息已成為極其關鍵的資源&#xff0c;因此&#xff0c;保護敏感數據至關重要。ONLYOFFICE 協作空間中的虛擬數據房間&#xff08;VDR&#xff09;提供了一個安全便捷的工作空間&#xff0c;確保文檔受到嚴密保護的同時&#xff0c;也能實現輕…

系統架構設計師論文分享-論軟件架構復用

我的軟考歷程 摘要 2023年2月&#xff0c;我所在的公司通過了研發紗線MES系統的立項&#xff0c;該項目為國內紗線工廠提供SAAS服務&#xff0c;旨在提升紗線工廠的數字化和智能化水平。我在該項目中擔任架構設計師&#xff0c;負責該項目的架構設計工作。本文結合我在該項目…

虛擬主機與獨立服務器如何選擇

在搭建和維護網站時&#xff0c;選擇合適的服務器套餐至關重要。虛擬主機和獨立服務器是兩種常見的選擇&#xff0c;它們各有優缺點&#xff0c;適用于不同需求的用戶。本文將深入探討這兩種服務器類型的特點&#xff0c;以幫助您為您的網站選擇最合適的服務器解決方案。虛擬主…

NFC的安全技術體系

NFC&#xff08;近場通信&#xff09;技術因廣泛應用于移動支付、身份認證、門禁控制等敏感場景&#xff0c;其安全技術體系是保障用戶數據與交易安全的核心。該體系涵蓋數據傳輸安全、存儲安全、身份認證、防攻擊機制等多個維度&#xff0c;通過硬件隔離、加密算法、協議規范等…

Echarts3D柱狀圖-圓柱體-文字在柱體上垂直顯示的實現方法

全部代碼 <!DOCTYPE html> <html lang"en" style"height: 100%"> <head><meta charset"utf-8"><title>3D柱狀圖-圓柱體-文字豎排</title> </head> <body style"height: 100%; margin: 0"…

【算法訓練營Day08】字符串part2

文章目錄 反轉字符串里的單詞右旋字符串KMP算法雙指針法總結 反轉字符串里的單詞 題目鏈接&#xff1a;151. 反轉字符串中的單詞 雙指針法解題邏輯 head指針遍歷字符串遍歷到單詞首單詞&#xff0c;生成end指針移動到單詞尾部遇到完整單詞收集&#xff0c;壓入棧中head指針移動…

如何使用backtrace定位Linux程序的崩潰位置

在嵌入式Linux開發中&#xff0c;特別是復雜軟件&#xff0c;多人協作開發時&#xff0c;當某人無意間寫了一個代碼bug導致程序崩潰&#xff0c;但又不知道崩潰的具體位置時&#xff0c;單純靠走讀代碼&#xff0c;很難快速的定位問題。 本篇就來介紹一種方法&#xff0c;使用…

十大排序算法匯總

好的&#xff0c;下面為你整理一篇面試全覆蓋、極其深入的十大排序算法總結博客&#xff0c;涵蓋算法原理、復雜度、穩定性、應用場景、工程實踐、C與Python實現&#xff08;含詳細注釋&#xff09;&#xff0c;并對比分析各種排序的優缺點與適用情境。內容力求結構清晰、講解透…

零基礎 “入坑” Java--- 七、數組(二)

文章目錄 一、數組轉字符串二、數組的拷貝三、求數組中元素的平均值四、查找數組中指定元素&#xff08;順序查找&#xff09;五、數組排序&#xff08;冒泡排序&#xff09;六、查找數組中指定元素&#xff08;二分查找&#xff09;七、判斷兩個數組中的元素是否相等八、填充數…

【C++ 真題】P1104 生日

P1104 生日 題目描述 cjf 君想調查學校 OI 組每個同學的生日&#xff0c;并按照年齡從大到小的順序排序。但 cjf 君最近作業很多&#xff0c;沒有時間&#xff0c;所以請你幫她排序。 輸入格式 輸入共有 n 1 n 1 n1 行&#xff0c; 第 1 1 1 行為 OI 組總人數 n n n&…

Oracle DB和PostgreSQL,OpenGauss主外鍵一致性的區別

針對于unique索引在主外鍵上的表現&#xff0c;o和PG的行為確實不一致&#xff0c;測試樣例&#xff1a;PG:測試1&#xff1a;test# CREATE TABLE gdb_editingtemplates ( objectid INTEGER NOT NULL, globalid VARCHAR(38) DEFAULT {00000000-0000-0000-0000-000000000000} …

06.自動化測試概念

自動化測試概念 1. 自動化1.1 回歸測試1.2 自動化分類 1.3 自動化測試金字塔2. web自動化測試3.Selenium 1. 自動化 ? **自動化測試&#xff08;Automated Testing&#xff09;&#xff1a;**是指使用軟件工具或腳本來自動執行測試任務&#xff0c;代替人工進行重復性、繁瑣的…

頁面登錄數據的加密(前端+后端)

本加密過程使用的 AESRSA概要1.使用AES對傳輸數據進行加密AES為對稱加密,加密和解決所需要的key是一樣的,所以攔截到AES key就可以直接解密,所以需要結果RSA進行加密2.對AES的key進行RSA加密RSA為非對稱加密,客戶端只能獲取到publicKey(公鑰),而解密只能使用服務器的privateKey…

PC端基于SpringBoot架構控制無人機(一):初識無人機控制

一、無人機飛控系統的概述飛控&#xff08;Flight Controller&#xff09;是無人機最為核心的組成部分之一&#xff0c;負責實現無人機的自主飛行控制和穩定飛行。飛控系統的功能決定了無人機的飛行性能&#xff0c;包括飛行的穩定性、操控的響應速度、導航的精確度等。通過飛控…

QT6 源(154)模型視圖架構里的列表視圖 QListView:先學習屬性部分,

&#xff08;1&#xff09;屬性總圖&#xff0c;以及測試程序的框架 &#xff1a; 開始屬性的學習 &#xff1a; &#xff08;2&#xff09; 繼續屬性學習 &#xff1a; &#xff08;3&#xff09; 謝謝

MySQL——9、事務管理

事務管理 1、什么是事務&#xff1f;2、事務常見操作方式3、事務隔離級別4、數據庫并發場景4.1、讀-寫4.2、RR與RC的本質區別 1、什么是事務&#xff1f; mysql是基于CS模式的&#xff0c;是一套網絡服務&#xff0c;所以我們是可以在本地連接上遠程服務器的mysql服務端的。my…

Python之面向對象詳解(一篇足矣)

目錄 一、初階面向對象 1. 初識面向對象 1.1 對象和self 1.2 常見成員 1.3 應用示例 將數據封裝到一個對象&#xff0c;便于以后使用。 將數據封裝到對象中&#xff0c;在方法中對原始數據進行加工處理。 根據類創建多個對象&#xff0c;在方法中對對象中的數據進行修改…

【Qt】qml組件對象怎么傳遞給c++

將QML組件對象傳遞給C的方法 在QML和C之間傳遞完整的組件對象需要特殊處理&#xff0c;因為QML組件是動態創建的JavaScript對象。以下是幾種有效的方法&#xff1a; 1. 使用QObject指針傳遞 C端設置 // MyClass.h #include <QObject> #include <QQuickItem>cla…