如何 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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;…