如何 ASP.NET Core 中使用 WebSocket

如何在 ASP.NET Core 中使用 WebSocket

在現代 Web 應用程序中,WebSocket 連接非常流行且使用率極高。它可以幫助企業滿足數字環境需求,并處理來自最終用戶的實時數據。它還能提升生產力、輸出率和用戶體驗。

如果您還沒有使用 WebSocket,那么您應該開始在 ASP.NET Core 應用程序中使用它。它將幫助您在這個充滿活力的市場中實現預期的業務成果。要了解其實現方式,請進一步探索提供的流程。

ASP.NET Core 應用程序中的 WebSocket 是什么?

在 ASP.NET Core 應用程序中,Web Sockets 啟用了一種在服務器和客戶端之間建立低開銷通信的協議。它允許服務器-客戶端架構中的設備持續通信,直到其中一方關閉連接。

在實時應用中,WebSocket 起著主要作用,因為它們使服務器能夠接收持續更新的數據。這種連接本質上是雙向的,并且需要 HTTP 支持才能實現穩定性、性能和速度。

何時在 ASP.NET Core 項目中實現 WebSocket 連接功能?

只有符合以下要求或用例時,才應在 ASP.NET Web API 應用程序和其他應用程序中實現 WebSockets。

?? ?? 開發實時應用程序,如聊天室、金融科技或企業系統。
? 構建一個在線游戲應用程序,其中服務器接收不斷的客戶端更新。
? 當您需要刷新 UI 而用戶沒有要求時。
? 用于構建供內部、部門內或建筑物內使用的聊天應用程序。
? 創建用于實時股票和股份交易的外匯和交易系統。

同樣,您可以確定您的需求是否屬于這些場景。為了更好地澄清,請咨詢.NET 開發公司或聘請 .NET Core 開發人員。

深入了解 ASP.NET Core 應用程序中的 Web Sockets:一個實際示例

在這里,我們將學習 ASP.NET Core 項目中 WebSocket 的功能。完成本教程后,您將了解 ASP.NET Web API 應用程序的 WebSocket 通信配置的基礎知識。

首先,下載、安裝并打開最新版本的 Visual Studio IDE。本教程將使用 .NET 6.0 框架。您可以使用更高版本,但在實施之前,請檢查其對協議的支持情況。

該過程分為三個主要階段,概述如下:

?? ?? 第 1 階段:服務器端配置
? 第 2 階段:客戶端配置
? 第 3 階段:測試 WebSockets 通信

讓我們從過程開始。

階段 1:服務器端配置

?? ?? 步驟 1:在 Visual Studio IDE 中,創建一個空的 ASP.NET Core 項目,使用 C#作為其主要編程語言。

在每個項目設置屏幕上,您都會在右下角找到“下一步/創建”按鈕。填寫詳細信息并選擇可靠的選項后,點擊該按鈕繼續操作。

步驟 2:在“配置新項目”屏幕上,根據您的需求填寫項目詳細信息。在本教程中,我們使用“ SimpleWS-Server ”作為項目和解決方案名稱。

步驟 3:在“附加信息”屏幕上,選擇.NET 6.0,其余設置保持不變。確保所有設置與以下代碼片段中的設置一致。

步驟 4:項目生成后,您將在“解決方案資源管理器”選項卡中看到其所有關聯文件。此外,它將顯示如下所示的默認 Hello World 代碼。您必須將app.Run ()方法替換為 app.RunAsync()。

步驟 5:現在,我們將添加UseWebSockets()函數和builder.WebHost.UserUrls()方法。

該函數將使我們的應用程序能夠使用 WebSocket 通信。該方法將有助于定義服務器的端口和 URL,在本例中為“ http://localhost:6969 ” 。

步驟 6:在 WebSocket 函數之后,配置服務器的端點映射。我們將使用app.Map()方法,并將 WebSocket 路由設置為“ ws ”。此外,我們還將在同一方法中添加上下文。

步驟 7:應用程序中的上下文。需要配置map ()方法。在其中,我們將添加僅接受/允許 WebSocket 通信的邏輯。

為此,您必須添加 context.WebSockets.IsWebSocketRequest檢查。如果請求是 Web 套接字,ASP.NET Core 應用程序將接受它;否則,將發送 400 錯誤(錯誤請求)。

步驟8:一旦應用程序確認這是一個Web套接字連接,它就應該為其定義一個實例。為此,請添加以下代碼。

using var ws = await context.WebSockets.AcceptWebSocketAsync();?

該實例將有助于使用ws.State驗證當前連接狀態。

在上面的代碼片段中,您可以看到 Web Socket 可以經歷的所有七種連接狀態。每個狀態都有一個對應的值,用于確定當前狀態。

步驟9:要使服務器能夠發送消息,請使用WebSocket 實例上的SendAsync()方法。它接受以下參數。

?? ?? ArraySegment<byte>
? WebSocketMessageType enum
? Bool endofMessage
? CancelationToken

所有這些參數都需要轉換為字節數組,從而生成ArraySegment<byte>并向客戶端發送消息。

var message = "Hello World!";
var bytes = Encoding.UTF8.GetBytes(message);
var arraySegment = new ArraySegment<byte>(bytes, 0, bytes.Length);
await ws.SendAsync(arraySegment,
WebSocketMessageType.Text,
true,
CancellationToken.None);?

步驟 10:為了讓 WebSocket 服務器以“ HH:MM:SS ”格式返回當前時間給客戶端,請將以下邏輯包裝在 while(true) 循環中,如下所示。該邏輯還使用Thread.Sleep(1000)函數將進程延遲 1 秒。

此外,代碼將驗證 WebSocket 連接狀態,僅當檢測到打開狀態時才發送消息。

到這里,服務器端配置就完成了。我們的 WebSockets 服務器已經準備好了。

階段 2:客戶端配置

讓我們創建 WebSocket 客戶端。

步驟 1:打開您的 Visual IDE以使用 C# 作為編程語言創建 .NET 控制臺應用程序。

步驟 2:填寫項目詳細信息。在本教程中,我們使用SimpleWS-Client作為解決方案和項目名稱。

步驟 3: 選擇.NET 6.0框架并創建項目。

步驟 4:為了使客戶端設備能夠啟動 Web 套接字連接,我們將使用System.Net.WebScokets提供的ClientWebSocket。

using System.Net.WebSockets;

var ws = new ClientWebSocket();?

步驟 5:要連接WebSockets服務器,請使用以下代碼塊。它包含帶有取消令牌和URL的ConnectAsync方法。

await ws.ConnectAsync(new Uri("ws://localhost:6969/ws"), CancellationToken.None);?

步驟 6:編寫代碼,讓客戶端在連接狀態變為alive后接收來自服務器的消息。

步驟 7:為了接收來自 WebSockets 服務器的消息,我們將RecieveAsync()方法添加到客戶端代碼庫。它將使客戶端設備能夠接受取消令牌和ArraySegment<byte>。

此外,您還將創建一個字節數組緩沖區來生成 ArraySegment<byte>。

步驟 8:使用上述所有代碼,我們的結果仍然是字節數組格式。但是,我們希望它顯示為字符串。因此,我們必須使用Encoding.UTF8.GetString()方法實現編碼。

另外,添加以下代碼來檢查連接是否未關閉。

result.MessageType == WebSocketMessageType.Close

步驟 9: 檢查代碼。確保最終的客戶端代碼與以下內容相同。

步驟 10: 測試 WebSockets 服務器和客戶端的功能。首先運行服務器項目,然后運行客戶端項目。如果顯示當前時間(HH:MM:SS)格式,則表示配置成功。

到目前為止,我們已經針對一個客戶端測試了 WebSockets 項目。但是在實際場景中,可能會有多個最終用戶。因此,在下一階段,我們將測試它處理多個 WebSocket 通信的能力。

階段 3:測試 WebSockets 通信

為了測試多個 WebSocket 連接,我們將創建并使用一個聊天室應用程序。它將包含以下功能:

?? ?? 連接多個用戶并為他們創建實例。
? 要求每個用戶輸入他們的用戶名/姓名。
? 廣播聊天室、加入和離開通知。
? 聊天室中每個用戶接收和發送消息。
? 通過檢查 WebSocket 連接狀態來刪除客戶端實例。

與前兩個階段的配置類似,我們將首先編寫服務器的代碼,然后編寫客戶端的代碼。

服務器代碼

您的完整服務器代碼將是以下代碼庫。

讓我們分解一下代碼。首先,你會找到代碼的用途,以及它下面執行該過程的代碼部分。

用于跟蹤多個 WebSocket連接。

為了向每個最終用戶/客戶端廣播消息,使用SendAsync()方法。

用于模擬聊天室并廣播新連接客戶端的用戶名。

為了管理消息接收過程,將使用類似于客戶端配置的RecieveAsync() 方法。

在WS 處理中調用 ReceiveMessage() 函數。

為了在聊天室中廣播收到的消息,使用Action<WebSocketReceiveResult, byte[]> handleMessage修改了 ReceiveMessage() 函數。

此外,我們修改了 ReceiveMessage 調用,使 lambda 函數能夠通過。此外,我們還將在 lambda 函數中添加邏輯,以便將一個用戶的消息廣播給聊天室中所有其他用戶。

下面的代碼用于跟蹤離開聊天室的用戶。它檢測 WebSocket 狀態以確定客戶端是否存在。

客戶端代碼

在客戶端添加以下代碼塊用于輸入用戶名。

使用以下代碼向服務器發送消息,該消息隨后將在聊天室中廣播。這里,將在 ClientWebSocket 實例上使用 SendAsync() 方法。

要管理退出聊天室的客戶端,請使用以下代碼。它將告訴應用程序刪除該特定客戶端的 WebSocket 實例。

現在客戶端代碼已經完成,只剩下測試部分。

要測試聊天室應用程序,請運行服務器和客戶端項目。如果看到“用戶加入房間”消息,則表示ASP.NET Core 應用運行成功。

現在,創建另一個客戶端實例,以驗證服務器是否正在檢測并廣播新的用戶加入通知。輸出將類似于以下內容。

進一步,從第二個實例發送消息并持續監視第一個客戶端接收消息。

現在,關閉第二個實例的連接并打開一個新客戶端(第三個客戶端)。

類似地,您可以發送消息、添加新客戶端、刪除當前客戶端以及廣播消息來測試 ASP.NET Core WebSockets 應用程序。

總結 ASP.NET Core 中的 WebSockets

實時應用程序廣泛使用 WebSocket,在服務器-客戶端架構中提供雙向通信。要實現它,您首先應該選擇正確的用例,正如本博客中所述。此外,您可以按照提供的步驟了解其實現方式。

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

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

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

相關文章

Python之--元組

定義是 Python 中內置的不可變序列。在 Python 中使用&#xff08;&#xff09;定義元組&#xff0c;元素與元素之間使用英文的逗號分隔。元組中只有一個元素的時候&#xff0c;逗號也不能省略。元組的創建方式&#xff08;1&#xff09;使用&#xff08;&#xff09;直接創建元…

工業相機GigE數據接口的優勢及應用

工業相機不同的數據接口適用的應用場景也不同&#xff0c;選擇合適的數據額接口&#xff0c;可大大提高效率。今天我們來看看常見的GigE接口的優勢及應用。基于GigE Vision標準的千兆以太網&#xff08;GigE&#xff09;相機通過提供快速、靈活且成本效益高的成像解決方案&…

【53】MFC入門到精通——MFC串口助手(二)---通信版(發送數據 、發送文件、數據轉換、清空發送區、打開/關閉文件),附源碼

文章目錄1 完整 功能展示2 添加控件變量及聲明2.1 添加控件及變量2.2 SerialPortDlg.h: 頭文件3 函數實現3.1 數據發送3.1.2 寫數據、字符串轉3.2 發送文件3.2.1 打開文件3.2.2 發送文件3.3 清空發送區4 完整MFC項目項下載1 完整 功能展示 串口通信助手 頁面展示&#xff0c;功…

算法學習筆記:27.堆排序(生日限定版)——從原理到實戰,涵蓋 LeetCode 與考研 408 例題

堆排序&#xff08;Heap Sort&#xff09;是一種基于二叉堆數據結構的高效排序算法&#xff0c;由計算機科學家 J. W. J. Williams 于 1964 年提出。它結合了選擇排序的思想和二叉堆的特性&#xff0c;具有時間復雜度穩定&#xff08;O (nlogn)&#xff09;、原地排序&#xff…

I/O 多路復用select,poll

目錄 I/O多路復用的介紹 多進程/多線程模型的弊端 網絡多路復用如何解決問題&#xff1f; 網絡多路復用的常見實現方式 常見的開源網絡庫 select詳細介紹 select函數介紹 套接字可讀事件,可寫事件,異常事件 fd_set類型介紹 select的兩次拷貝&#xff0c;兩次遍歷 se…

最終分配算法【論文材料】

文章目錄一、最終分配算法1.1 平衡的情況1.2 不平衡的情況1.3 TDM 約束一、最終分配算法 上一步合法化后&#xff0c;group 的 TDM 情況大致分為兩類&#xff0c;一類是平衡的&#xff0c;最大的一些 group 的 TDM 比較接近。另外一種情況就是不平衡的&#xff0c;最大的 group…

《大數據技術原理與應用》實驗報告七 熟悉 Spark 初級編程實踐

目 錄 一、實驗目的 二、實驗環境 三、實驗內容與完成情況 3.1 Spark讀取文件系統的數據。 3.2 編寫獨立應用程序實現數據去重。 3.3 編寫獨立應用程序實現求平局值問題。 四、問題和解決方法 五、心得體會 一、實驗目的 1. 掌握使用 Spark 訪問本地文件和 HDFS 文件的…

機器學習漫畫小抄 - 彩圖版

斯坦福機器學習漫畫小抄&#xff0c;中文版來啦&#xff01; 下載地址&#xff1a; 通過網盤分享的文件&#xff1a;機器學習知識點彩圖版.pdf 鏈接: https://pan.baidu.com/s/1-fH9OpC_u_OrTqWy6gVUCA 提取碼: 246r

1.初始化

業務模塊核心技術棧業務&#xff08;亮點&#xff09;解決方案課程安排01 認識Vue3為什么需要學Vue3?Vue3組合式API體驗Vue3更多的優勢2 使用create-vue搭建Vue3項目認識 create-vue使用create-vue創建項目3 熟悉項目目錄和關鍵文件項目目錄和關鍵文件4 組合式API - setup選項…

Milvus分布式數據庫工作職責

主導騰訊云Milvus服務化項目&#xff0c;設計多租戶隔離方案&#xff0c;支撐日均10億向量請求&#xff0c;延遲降低40%。優化IVF_PQ索引構建流程&#xff0c;通過量化編碼壓縮使內存占用減少60%&#xff0c;QPS提升35%。開發基于Kubernetes的Milvus Operator&#xff0c;實現自…

FMEA-CP-PFD三位一體數字化閉環:汽車部件質量管控的速效引擎

FMEA-CP-PFD三位一體數字化閉環&#xff1a;汽車部件質量管控的速效引擎 全星FMEA軟件系統通過??FMEA&#xff08;失效模式分析&#xff09;、CP&#xff08;控制計劃&#xff09;、PFD&#xff08;過程流程圖&#xff09;三大工具的一體化協同管理??&#xff0c;為汽車部件…

VUE2 學習筆記1

目錄 VUE特點 文檔tips 開發者工具 從一個Hello world開始 hello world Demo 容器和實例的對應關系 差值語法{{}} VUE特點 構建用戶界面&#xff1a;可以用來把數據構建成用戶界面。 漸進式&#xff1a;自底向上&#xff0c;可以先從一個非常輕量級的框架開始&#xf…

嵌入式學習系統編程(四)進程

目錄 一、進程 1.程序和進程 2.進程的八種狀態 3. 幾個狀態 4.關于進程常用命令 二、關于進程的函數 1.fork 2.面問 3.孤兒進程 后臺進程 2. exec函數族 (只保留父子關系&#xff0c;做新的事情) strtok函數 三、進程的結束 1.分類 exit和_exit的區別 wait函數…

Linux中添加重定向(Redirection)功能到minishell

前言&#xff1a;在談論添加minishell之前&#xff0c;我再重談一下重定向的具體實現等大概思想&#xff01;&#xff01;&#xff01;方便自己回顧&#xff01;&#xff01;&#xff01; 目錄 一、重定向&#xff08;Redirection&#xff09;原理詳解 1、文件描述符基礎 2、…

Django由于數據庫版本原因導致數據庫遷移失敗解決辦法

在django開發中&#xff0c;一般我們初始化一個項目之后&#xff0c;創建應用一般就會生成如下的目錄&#xff1a;django-admin startproject myproject python manage.py startapp blogmyproject/ ├── manage.py └── myproject/ | ├── __init__.py | ├── se…

C++STL系列之vector

前言 vector是變長數組&#xff0c;有點像數據結構中的順序表&#xff0c;它和list也是經常被拿出作對比的&#xff0c; vector使用動態分配數組來存儲它的元素。當新元素插入時候&#xff0c;這個數組需要被重新分配大小&#xff0c;如果擴容&#xff0c;因為要開一個新數組把…

Functional C++ for Fun Profit

Lambda Conf上有人講C函數式編程。在Functional Conf 2019上&#xff0c;就有主題為“Lambdas: The Functional Programming Companion of Modern C”的演講。演講者介紹了現代C中函數式編程相關內容&#xff0c;講解了如何使用Lambda表達式編寫符合函數式編程原則的C代碼&…

Python基礎理論與實踐:從零到爬蟲實戰

引言Python如輕舟&#xff0c;載你探尋數據寶藏&#xff01;本文從基礎理論&#xff08;變量、循環、函數、模塊&#xff09;啟航&#xff0c;結合requests和BeautifulSoup實戰爬取Quotes to Scrape&#xff0c;適合零基礎到進階者。文章聚焦Python基礎&#xff08;變量、循環、…

ThingJS開發從入門到精通:構建三維物聯網可視化應用的完整指南

文章目錄第一部分&#xff1a;ThingJS基礎入門第一章 ThingJS概述與技術架構1.1 ThingJS平臺簡介1.2 技術架構解析1.3 開發環境配置第二章 基礎概念與核心API2.1 核心對象模型2.2 場景創建與管理2.3 對象操作基礎第三章 基礎開發實戰3.1 第一個ThingJS應用3.2 事件系統詳解3.3 …

關于list

1、什么是listlist是一個帶頭結點的雙向循環鏈表模版容器&#xff0c;可以存放任意類型&#xff0c;需要顯式定義2、list的使用有了前面學習string和vector的基礎&#xff0c;學習和使用list會方便很多&#xff0c;因為大部分的內容依然是高度重合的。與順序表不同&#xff0c;…