使用 .NET Core 的原始 WebSocket

????????在 Web 開發中,后端存在一些值得注意的通信協議,用于將更改通知給已連接的客戶端。所有這些協議都用于處理同一件事。但鮮為人知的協議很少,鮮為人知的協議也很少。今天,將討論 WebSocket,它在開發中使用最少,但它速度很快,是所有協議的根源!它通過單個持久連接在客戶端和服務器之間進行全雙工雙向通信。這與傳統的 HTTP 協議形成了鮮明對比,因為傳統的 HTTP 協議每個請求-響應周期都需要建立新的連接。WebSocket 非常適合實時應用程序,因為它們允許服務器將數據推送到客戶端,而無需等待客戶端請求。

????????將使用 .NET Core Web API 應用程序進行演示。希望大家知道如何使用 Visual Studio 創建 .NET Core Web API 應用程序。因此,不會從頭開始演示,而是重點介紹如何在現有應用程序中使用它,并在發生任何更改后通知連接的客戶端。

1. 將 WebSocket 添加到應用程序

修改您的Program.cs以啟用 WebSockets。

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.UseWebSockets();
app.UseRouting();

app.MapControllers();

app.Run();

2.創建WebSocket服務

創建服務和接口來管理 WebSocket 連接。

namespace GraphicsBackend.Services
{
public interface IWebSocketService
{
Task AddSocketAsync(WebSocket webSocket);
Task BroadcastAsync(SocketMessage message);
Task NotifyClientsAsync(string message);
}
}

namespace GraphicsBackend.Services
{

? ? public class WebSocketService : IWebSocketService
{
private static readonly List<WebSocket> _connections = new();
public async Task AddSocketAsync(WebSocket webSocket)
{
_connections.Add(webSocket);
var buffer = new byte[1024 * 4];
while (webSocket.State == WebSocketState.Open)
{
var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
if (result.MessageType == WebSocketMessageType.Close)
{
_connections.Remove(webSocket);
await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closed by client", CancellationToken.None);
}
}

? ? ? ? }
public async Task NotifyClientsAsync(string message)
{
var tasks = _connections
.Where(s => s != null && s.State == WebSocketState.Open)
.Select(s => s.SendAsync(
new ArraySegment<byte>(Encoding.UTF8.GetBytes(message)),
WebSocketMessageType.Text, true, CancellationToken.None));

? ? ? ? ? ? await Task.WhenAll(tasks);
}

? ? ? ? public async Task BroadcastAsync(SocketMessage message)
{
var serializedMessage = JsonConvert.SerializeObject(message);
await NotifyClientsAsync(serializedMessage);
}
}

3.創建 WebSocket 控制器

該控制器將處理 WebSocket 連接。

[Route("ws")]
[ApiController]
public class WebSocketController : ControllerBase
{
private readonly IWebSocketService _webSocketService;

? ? public WebSocketController(IWebSocketService ?webSocketService)
{
_webSocketService= webSocketService;
}

? ? [HttpGet]
public async Task Get()
{
if (HttpContext.WebSockets.IsWebSocketRequest)
{
using var webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync();
await _webSocketService.AddSocketAsync(webSocket);
}
else
{
HttpContext.Response.StatusCode = 400;
}
}
}

4. 將 WebSocketService 注入服務

在Program.cs中注冊WebSocketService和IWebSocketService,以便可以在整個應用程序中使用它。

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddSingleton<IWebSocketService,WebSocketService>();

var app = builder.Build();

app.UseWebSockets();
app.MapControllers();

app.Run();

5. 通知客戶端 API 操作中的任何操作

修改您的 API 控制器以發送通知。

[Route("api/customers")]
[ApiController]
public class HomeController: ControllerBase
{
private readonly IWebSocketService _webSocketService;

? ? public CustomerController(IWebSocketService ?webSocketService)
{
_webSocketService= webSocketService;
}

? ? [HttpPost]
public async Task<IActionResult> Create([FromBody] Model model)
{
// Save customer to DB (your logic)

? ? ? ? // Notify clients
await _webSocketService.NotifyClientsAsync("New model added!");

? ? ? ? return Ok();
}
}

6. 從前端連接

使用 JavaScript 監聽來自 WebSocket 的消息。

const socket = new WebSocket("ws://localhost:5000/ws");

socket.onmessage = function(event) {
console.log("Notification received:", event.data);
};

socket.onopen = function() {
console.log("WebSocket connected!");
};

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

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

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

相關文章

編程實現Word自動排版:從理論到實踐的全面指南

在現代辦公環境中&#xff0c;文檔排版是一項常見但耗時的工作。特別是對于需要處理大量文檔的專業人士來說&#xff0c;手動排版不僅費時費力&#xff0c;還容易出現不一致的問題。本文將深入探討如何通過編程方式實現Word文檔的自動排版&#xff0c;從理論基礎到實際應用&…

力扣經典算法篇-25-刪除鏈表的倒數第 N 個結點(計算鏈表的長度,利用棧先進后出特性,雙指針法)

1、題干 給你一個鏈表&#xff0c;刪除鏈表的倒數第 n 個結點&#xff0c;并且返回鏈表的頭結點。 示例 1&#xff1a;輸入&#xff1a;head [1,2,3,4,5], n 2 輸出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 輸入&#xff1a;head [1], n 1 輸出&#xff1a;[] 示例 3&…

VIT速覽

當我們取到一張圖片&#xff0c;我們會把它劃分為一個個patch&#xff0c;如上圖把一張圖片劃分為了9個patch&#xff0c;然后通過一個embedding把他們轉換成一個個token&#xff0c;每個patch對應一個token&#xff0c;然后在輸入到transformer encoder之前還要經過一個class …

【服務器與部署 14】消息隊列部署:RabbitMQ、Kafka生產環境搭建指南

【服務器與部署 14】消息隊列部署&#xff1a;RabbitMQ、Kafka生產環境搭建指南 關鍵詞&#xff1a;消息隊列、RabbitMQ集群、Kafka集群、消息中間件、異步通信、微服務架構、高可用部署、消息持久化、生產環境配置、分布式系統 摘要&#xff1a;本文從實際業務場景出發&#x…

LeetCode中等題--167.兩數之和II-輸入有序數組

1. 題目 給你一個下標從 1 開始的整數數組 numbers &#xff0c;該數組已按 非遞減順序排列 &#xff0c;請你從數組中找出滿足相加之和等于目標數 target 的兩個數。如果設這兩個數分別是 numbers[index1] 和 numbers[index2] &#xff0c;則 1 < index1 < index2 <…

【C# in .NET】19. 探秘抽象類:具體實現與抽象契約的橋梁

探秘抽象類:具體實現與抽象契約的橋梁 在.NET類型系統中,抽象類是連接具體實現與抽象契約的關鍵橋梁,它既具備普通類的狀態承載能力,又擁有類似接口的行為約束特性。本文將從 IL 代碼結構、CLR 類型加載機制、方法調度邏輯三個維度,全面揭示抽象類的底層工作原理,通過與…

Apache RocketMQ + “太乙” = 開源貢獻新體驗

Apache RocketMQ 是 Apache 基金會托管的頂級項目&#xff0c;自 2012 年誕生于阿里巴巴&#xff0c;服務于淘寶等核心交易系統&#xff0c;歷經多次雙十一萬億級數據洪峰穩定性驗證&#xff0c;至今已有十余年發展歷程。RocketMQ 致力于構建低延遲、高并發、高可用、高可靠的分…

永磁同步電機控制算法--弱磁控制(變交軸CCR-VQV)

一、原理介紹CCR-FQV弱磁控制不能較好的利用逆變器的直流側電壓&#xff0c;造成電機的調速范圍窄、效率低和帶載能力差。為了解決CCR-FQV弱磁控制存在的缺陷&#xff0c;可以在電機運行過程中根據工況的不同實時的改變交軸電壓給定uq?的值&#xff0c;實施 CCR-VQV弱磁控制。…

達夢數據守護集群搭建(1主1實時備庫1同步備庫1異步備庫)

目錄 1 環境信息 1.1 目錄信息 1.2 其他環境信息 2 環境準備 2.1 新建dmdba用戶 2.2 關閉防火墻 2.3 關閉Selinux 2.4 關閉numa和透明大頁 2.5 修改文件打開最大數 2.6 修改磁盤調度 2.7 修改cpufreq模式 2.8 信號量修改 2.9 修改sysctl.conf 2.10 修改 /etc/sy…

電感與電容充、放電極性判斷和電感選型

目錄 一、電感 二、電容 三、電感選型 一、電感 充電&#xff1a;左右-為例 放電&#xff1a;極性相反&#xff0c;左-右 二、電容 充電&#xff1a;左右-為例 放電&#xff1a;左右-&#xff08;與充電極性一致&#xff09; 三、電感選型 主要考慮額定電流和飽和電流。…

新建模范式Mamba——“Selectivity is All You Need?”

目錄 一、快速走進和理解Mamba建模架構 &#xff08;一&#xff09;從Transformer的統治地位談起 &#xff08;二&#xff09;另一條道路&#xff1a;結構化狀態空間模型&#xff08;SSM&#xff09; &#xff08;三&#xff09;Mamba 的核心創新&#xff1a;Selective SSM…

Python實現Word文檔中圖片的自動提取與加載:從理論到實踐

在現代辦公和文檔處理中&#xff0c;Word文檔已經成為最常用的文件格式之一。這些文檔不僅包含文本內容&#xff0c;還經常嵌入各種圖片、圖表和其他媒體元素。在許多場景下&#xff0c;我們需要從Word文檔中提取這些圖片&#xff0c;例如進行內容分析、創建圖像數據庫、或者在…

Kafka、RabbitMQ 與 RocketMQ 高可靠消息保障方案對比分析

Kafka、RabbitMQ 與 RocketMQ 高可靠消息保障方案對比分析 在分布式系統中&#xff0c;消息隊列承擔著異步解耦、流量削峰、削峰填谷等重要職責。為了保證應用的數據一致性和業務可靠性&#xff0c;各大消息中間件都提供了多種高可靠消息保障機制。本文以Kafka、RabbitMQ和Rock…

四足機器人遠程視頻與互動控制的全鏈路方案

隨著機器人行業的快速發展&#xff0c;特別是四足仿生機器人在巡檢、探測、安防、救援等復雜環境中的廣泛部署&#xff0c;如何實現高質量、低延遲的遠程視頻監控與人機互動控制&#xff0c;已經成為制約其應用落地與規模化推廣的關鍵技術難題。 四足機器人常常面臨以下挑戰&a…

把leetcode官方題解自己簡單解釋一下

自用自用&#xff01;&#xff01;&#xff01;leetcode hot 100

hive的sql優化思路-明白底層運行邏輯

一、首先要明白底層map、shuffle、reduce的順序之中服務器hdfs數據文件在內存與存儲之中是怎么演變的&#xff0c;因為hive的性能瓶頸基本在內存&#xff0c;具體參考以下他人優秀文章&#xff1a; 1.Hive SQL底層執行過程詳細剖析 2.Hive JOIN性能調優 二是要明白hive對應的…

驅動隔離芯片在現代工業上的卓越貢獻

在智能時代的精密齒輪中&#xff0c;驅動隔離芯片如同一位精通跨界語言的“安全架構師”&#xff0c;在高壓與低壓、危險與精密的交界處重構秩序。它不生產數據&#xff0c;卻是信息的守門人&#xff1b;不創造能量&#xff0c;卻是電流的馴獸師。從鋼鐵叢林到生命方舟&#xf…

使用MATLAB探索圓周率π的奇妙計算之旅

在數學的璀璨星河中,圓周率π無疑是最耀眼的明星之一。這個看似簡單的無理數蘊含著宇宙的奧秘,吸引著無數科學家和數學愛好者探索其計算方法。今天,我們將使用MATLAB這一強大的科學計算工具,踏上π的計算之旅,體驗從古典算法到現代技巧的奇妙過程。 1. 蒙特卡洛法:隨機的…

React 服務器組件 (RSC)

文章目錄前言1. 什么是服務器組件 (Server Components)?2. 服務器組件的核心規則(1) 異步性 (async/await)(2) 無客戶端交互(3) 渲染限制3. 與客戶端組件的協作組合模式Props 傳遞規則4. 使用場景5. 文件命名約定6. 常見誤區7. 示例代碼服務端組件&#xff08;獲取數據&#x…

如何解決AttributeError: ‘NoneType‘ object has no attribute問題

如何解決AttributeError: ‘NoneType’ object has no attribute問題 問題背景與概述 在 Python 項目開發和調試過程中&#xff0c;經常會碰到這樣一個異常信息&#xff1a; AttributeError: NoneType object has no attribute foo這意味著你嘗試訪問或調用某個對象的屬性&a…