ASP.NET Core 中使用 WebSocket 协议进行实时通信

这篇具有很好参考价值的文章主要介绍了ASP.NET Core 中使用 WebSocket 协议进行实时通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

介绍
在 ASP.NET Core 中使用 WebSocket 协议创建实时通信的完整示例涉及几个步骤。在此示例中,我们将创建一个简单的聊天应用程序,用户可以在其中实时发送和接收消息。此示例假设您对 ASP.NET Core 和 C# 有基本了解。

步骤1.创建一个新的ASP.NET Core项目
首先,使用 Visual Studio 或命令行创建一个新的 ASP.NET Core 项目。您可以选择 ASP.NET Core Web 应用程序模板并选择空模板。

步骤 2. 安装 WebSocket NuGet 包
在您的项目中,您需要安装 Microsoft.AspNetCore.WebSockets NuGet 包,它提供 WebSocket 支持。

dotnet add package Microsoft.AspNetCore.WebSockets

步骤 3. 创建 WebSocket 中间件
在 Startup.cs 文件中,在 Configure 方法中配置 WebSocket 中间件。

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using WebSocketChatApp.Middleware;

Author: Sardar Mudassar Ali Khan
namespace WebSocketChatApp
{
    public class Startup
    {
        // ... other configurations ...

        public void ConfigureServices(IServiceCollection services)
        {
            // ... other services ...

            services.AddWebSocketManager();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            // ... other middleware ...

            app.UseWebSockets();
            app.MapWebSocketManager("/chat", app.ApplicationServices.GetService<ChatWebSocketHandler>());

            // ... other configurations ...
        }
    }
}

步骤 4. 创建 WebSocket 处理程序
创建 WebSocket 处理程序类来管理 WebSocket 连接和消息。您可以将其命名为 ChatWebSocketHandler.cs。
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using System;
using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;

Author: Sardar Mudassar Ali Khan
namespace WebSocketChatApp.Middleware
{
    public class ChatWebSocketHandler
    {
        private readonly WebSocketConnectionManager _connectionManager;
        private readonly ILogger<ChatWebSocketHandler> _logger;

        public ChatWebSocketHandler(WebSocketConnectionManager connectionManager, ILogger<ChatWebSocketHandler> logger)
        {
            _connectionManager = connectionManager;
            _logger = logger;
        }

        public async Task HandleWebSocket(HttpContext context, WebSocket webSocket)
        {
            var socketId = _connectionManager.AddSocket(webSocket);

            _logger.LogInformation($"WebSocket connection established with ID {socketId}");

            while (webSocket.State == WebSocketState.Open)
            {
                var message = await ReceiveMessageAsync(webSocket);
                if (message != null)
                {
                    _logger.LogInformation($"Received message from ID {socketId}: {message}");
                    await BroadcastMessageAsync(message);
                }
            }

            _connectionManager.RemoveSocket(socketId);
            _logger.LogInformation($"WebSocket connection closed with ID {socketId}");
        }

        private async Task<string?> ReceiveMessageAsync(WebSocket webSocket)
        {
            var buffer = new byte[1024];
            var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);

            if (result.CloseStatus.HasValue)
            {
                return null;
            }

            return System.Text.Encoding.UTF8.GetString(buffer, 0, result.Count);
        }

        private async Task BroadcastMessageAsync(string message)
        {
            foreach (var socket in _connectionManager.GetAllSockets())
            {
                if (socket.Value.State == WebSocketState.Open)
                {
                    await socket.Value.SendAsync(System.Text.Encoding.UTF8.GetBytes(message), WebSocketMessageType.Text, true, CancellationToken.None);
                }
            }
        }
    }
}

步骤 5. 创建 WebSocket 连接管理器
创建 WebSocket 连接管理器来跟踪连接的 WebSocket 客户端。您可以将其命名为 WebSocketConnectionManager.cs。
using System;
using System.Collections.Concurrent;
using System.Net.WebSockets;

Author: Sardar Mudassar Ali Khan
namespace WebSocketChatApp.Middleware
{
    public class WebSocketConnectionManager
    {
        private readonly ConcurrentDictionary<Guid, WebSocket> _sockets = new ConcurrentDictionary<Guid, WebSocket>();

        public WebSocket AddSocket(WebSocket socket)
        {
            var socketId = Guid.NewGuid();
            _sockets.TryAdd(socketId, socket);
            return socketId;
        }

        public WebSocket? GetSocket(Guid socketId)
        {
            _sockets.TryGetValue(socketId, out var socket);
            return socket;
        }

        public ConcurrentDictionary<Guid, WebSocket>.ValueCollection GetAllSockets()
        {
            return _sockets.Values;
        }

        public Guid? GetSocketId(WebSocket socket)
        {
            foreach (var (key, value) in _sockets)
            {
                if (value == socket)
                {
                    return key;
                }
            }
            return null;
        }

        public void RemoveSocket(Guid socketId)
        {
            _sockets.TryRemove(socketId, out _);
        }
    }
}


步骤 6. 创建 WebSocket 端点
在控制器中创建一个 WebSocket 端点来处理 WebSocket 连接。
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Net.WebSockets;
using System.Threading.Tasks;
using WebSocketChatApp.Middleware;

Author: Sardar Mudassar Ali Khan
namespace WebSocketChatApp.Controllers
{
    [Route("api/[controller]")]
    public class ChatController : ControllerBase
    {
        private readonly ChatWebSocketHandler _webSocketHandler;

        public ChatController(ChatWebSocketHandler webSocketHandler)
        {
            _webSocketHandler = webSocketHandler;
        }

        [HttpGet]
        public async Task<IActionResult> Get()
        {
            if (HttpContext.WebSockets.IsWebSocketRequest)
            {
                var webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync();
                await _webSocketHandler.HandleWebSocket(HttpContext, webSocket);
            }
            else
            {
                return BadRequest("WebSocket is not supported.");
            }

            return Ok();
        }
    }
}

步骤 7. 创建客户端应用程序
使用 JavaScript 创建一个简单的 HTML 页面来连接到 WebSocket 服务器并发送/接收消息。这是一个基本示例:
<!DOCTYPE html>
<html>
<head>
    <title>WebSocket Chat By Sardar Mudassar Ali Khan</title>
</head>
<body>
    <input type="text" id="messageInput" placeholder="Enter your message" />
    <button οnclick="sendMessage()">Send</button>
    <div id="chat"></div>

    <script>
        const socket = new WebSocket("ws://localhost:5000/api/chat");

        socket.onopen = (event) => {
            console.log("WebSocket connection established.");
        };

        socket.onmessage = (event) => {
            const chatDiv = document.getElementById("chat");
            chatDiv.innerHTML += `<p>${event.data}</p>`;
        };

        socket.onclose = (event) => {
            if (event.wasClean) {
                console.log(`WebSocket connection closed cleanly, code=${event.code}, reason=${event.reason}`);
            } else {
                console.error(`WebSocket connection died`);
            }
        };

        function sendMessage() {
            const messageInput = document.getElementById("messageInput");
            const message = messageInput.value;
            socket.send(message);
            messageInput.value = "";
        }
    </script>
</body>
</html>


步骤 8. 运行应用程序
构建并运行您的 ASP.NET Core 应用程序。在浏览器中访问 WebSocket 聊天页面。您应该能够实时发送和接收消息。

此示例提供了 ASP.NET Core 中 WebSocket 聊天应用程序的基本实现。您可以根据需要扩展和自定义它。

结论
此示例提供了使用 WebSocket 在 ASP.NET Core 中进行实时通信的基础结构。您可以在此基础上进行扩展,通过添加身份验证、用户管理和消息持久性等功能来创建更复杂的实时应用程序,例如聊天室、通知或协作编辑工具。文章来源地址https://www.toymoban.com/news/detail-824804.html

到了这里,关于ASP.NET Core 中使用 WebSocket 协议进行实时通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 实战指南:使用 xUnit 和 ASP.NET Core 进行集成测试【完整教程】

    集成测试可在包含应用支持基础结构(如数据库、文件系统和网络)的级别上确保应用组件功能正常。 ASP.NET Core 通过将单元测试框架与测试 Web 主机和内存中测试服务器结合使用来支持集成测试。 集成测试与单元测试相比,能够在更广泛的级别上评估应用的组件,确认多个

    2024年04月22日
    浏览(32)
  • ASP.NET Core实时库SignalR简单应用

    SignalR 是用于构建需要实时用户交互或实时数据更新的Web 应用程序的一个开放源代码.NET 库。不仅仅用在Web应用中,后面会讲到它的应用范围。它简化了简化了构建实时应用程序的过程,包括 ASP.NET Server 库和 JavaScript Client 库,以便管理Client与Server连接并将内容更新推送给Cl

    2024年02月11日
    浏览(61)
  • 关于ASP.NET Core WebSocket实现集群的思考

    前言     提到 WebSocket 相信大家都听说过,它的初衷是为了解决客户端浏览器与服务端进行双向通信,是在单个 TCP 连接上进行全双工通讯的协议。在没有WebSocket之前只能通过浏览器到服务端的请求应答模式比如轮询,来实现服务端的变更响应到客户端,现在服务端也可以主

    2024年04月14日
    浏览(35)
  • .Net6使用WebSocket与前端进行通信

    1. 创建类WebSocketTest: 2. 在program.cs中进行绑定 3. 使用websocket在线工具模拟请求:

    2024年02月03日
    浏览(39)
  • 服务端使用ASP.NET Core SignalR与Vue3(TypeScript与JavaScript)前端建立通信(以进度条为例)

    1. ASP.NET Core           ASP.NET Core 是一个跨平台、高性能及开源的框架,用于生成基于云且连接互联网的新式应用程式。 官方文档:ASP.NET documentation | Microsoft Learn  2.  ASP.NET Core SignalR         ASP.NET Core SignalR 是开源库,用于服务端与客户端建立实时通信,可以自动管理连接

    2024年02月06日
    浏览(36)
  • 基于asp.netCoreWebApi的webSocket通信示例(net6)

    背景:     在阿里云服务器中搭建了常规的tcp server服务(基于.net framework 4.0)。用以实现远程控制家里的鱼缸灯,办公室的电脑开关机等功能。客户端采用PC桌面端和微信小程序端。     服务端:tcp server(基于.net framework 4.0)     客户端:PC桌面端软件(.net winform)、微信小程序

    2023年04月22日
    浏览(33)
  • 在Keycloak中实现多租户并在ASP.NET Core下进行验证

    Keycloak是一个功能强大的开源身份和访问管理系统,提供了一整套解决方案,包括用户认证、单点登录(SSO)、身份联合、用户注册、用户管理、角色映射、多因素认证和访问控制等。它广泛应用于企业和云服务,可以简化和统一不同应用程序和服务的安全管理,支持自托管

    2024年04月08日
    浏览(32)
  • 【C#/.NET】使用ASP.NET Core对象池

    Microsoft.Extensions.ObjectPool   减少初始化/资源分配,提高性能。这一条与线程池同理,有些对象的初始化或资源分配耗时长,复用这些对象减少初始化和资源分配。比如:我有一个执行耗时约500毫秒,内存空间 2KB的任务为此创建一个新线程异步执行,而创建线程耗时1秒,内存空

    2024年02月06日
    浏览(57)
  • 前端(二十一)——WebSocket:实现实时双向数据传输的Web通信协议

    🤨博主:小猫娃来啦 🤨文章核心: WebSocket:实现实时双向数据传输的Web通信协议 在当今互联网时代,实时通信已成为很多应用的需求。为了满足这种需求,WebSocket协议被设计出来。WebSocket是一种基于TCP议的全双工通信协议,通过WebSocket,Web应用程序可以与服务器建立持久

    2024年02月04日
    浏览(56)
  • ASP.NET CORE API 使用Orleans

    快速使用Monimal API 快速集成Orleans 微软官网地址如下: https://learn.microsoft.com/zh-cn/dotnet/orleans/quickstarts/build-your-first-orleans-app?source=recommendationstabs=visual-studio 当然它的存储grain存储采用的是内存级别存储,我缓存了mssql 存储。如果是内存存储使用如下代码就Ok 我采用的是数据库存

    2024年02月06日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包