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

news/2024/5/19 22:25:48 标签: websocket, .NetCore

介绍
在 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 中进行实时通信的基础结构。您可以在此基础上进行扩展,通过添加身份验证、用户管理和消息持久性等功能来创建更复杂的实时应用程序,例如聊天室、通知或协作编辑工具。


http://www.niftyadmin.cn/n/5344305.html

相关文章

OpenSSL创建生成CA证书、服务器、客户端证书及密钥

OpenSSL创建生成CA证书、服务器、客户端证书及密钥 证数各参数含义生成CA证书创建root证书私钥创建请求证书创建自签署证书 生成服务器证书创建服务器证书创建服务器请求证书使用CA证书签署服务器证书 生成客户端证书创建客户端证书创建客户端请求证书使用CA证书签署客户端证书…

【Android】Android中的系统镜像由什么组成?

文章目录 总览Boot Loader 的加锁与解锁Boot 镜像内核RAM diskARM 中的设备树 (Device Tree) /System 和/Data 分区镜像参考 总览 各种Android设备都只能刷专门为相应型号的设备定制的镜像。 厂商会提供一套系统镜像把它作为“出厂默认”的 Android 系统刷在设备上。 一个完…

Jenkins上跑自动化项目,case出现错误时,导致项目运行时间过长,该如何处理?

1、方案一&#xff1a;Jenkins上调整 进入配置&#xff1a; 构建环境&#xff1a; 自行选择超时时间即可&#xff5e; 2、方案二&#xff1a;代码调整【python】 安装插件&#xff1a;pytest-timeout 选择一&#xff1a;装饰器用法&#xff1a;将单个测试用例标记为超时&…

正则表达式元字符-详细说明

字符 说明 \ 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如&#xff0c;"n"匹配字符"n"。"\n"匹配换行符。序列"\\\\"匹配"\\"&#xff0c;"\\("匹配"("。 ^ 匹配输入字符串…

【自然语言处理】【深度学习】NLP中的N-gram理解

N-gram是自然语言处理&#xff08;NLP&#xff09;中的一个概念&#xff0c;它描述的是文本中连续的n个项&#xff08;通常是单词或字符&#xff09;。这个概念主要用于语言建模和文本分析中。 具体来说&#xff1a; Unigram (1-gram): 包含一个单词的序列&#xff0c;例如句子…

KADB使用PXF连接KES验证

验证环境 KADB版本&#xff1a;Greenplum Database 6.0.0 build dev.V003R002C001B0181.d354cc9215 KES版本&#xff1a;KingbaseES V008R006C007B0012 Java版本&#xff1a;openjdk version "1.8.0_262" PXF部署 以下操作假设KADB和KES已经部署完成并且启动正常…

专业130+总分420+上海交通大学819考研经验分享上海交大电子信息与通信工程

今年专业课819信号系统与信息处理&#xff08;ss和dsp&#xff09;130&#xff0c;总分420&#xff0c;如愿梦圆交大&#xff0c;以下总结了自己这一年专业课&#xff0c;基础课复习经历&#xff0c;希望对大家复习有所帮助。专业课819信号系统与信号处理&#xff1a; 交大819…

vivado I/O和时钟规划设计流程步骤

I/O和时钟规划设计流程步骤 下图显示了左侧的项目设计流程步骤。水平箭头表示项目设计流程中可以执行I/O和时钟规划的点。中的步骤I/O和时钟规划设计流程如右图所示。 项目设计流程从一个空的I/O规划项目、RTL设计项目或合成后网表项目。使用这些项目类型中的任何一种&#xf…