在Asp.NET中实现WebSocket实时通讯

黑暗征服者 2024-04-18T03:00:12+08:00
0 0 323

WebSocket 是一种在客户端和服务器之间实现双向通信的协议,它通过长连接解决了传统的 HTTP 协议的请求-响应模式的限制。在 Asp.NET 中,我们可以轻松地实现 WebSocket 实时通讯,让我们来看一下具体的实现过程。

1. 创建 Asp.NET 项目

首先,我们需要创建一个新的 Asp.NET 项目。在 Visual Studio 中,选择 "新建项目",然后选择 "ASP.NET Web 应用程序",输入项目名称,点击 "确定"。

2. 添加 WebSocket 支持

在 Visual Studio 中打开刚创建的项目,并右键点击 "解决方案资源管理器" 中的项目名称,选择 "管理 NuGet 程序包"。在 "NuGet 包管理器" 中搜索并安装 "Microsoft.AspNetCore.WebSockets" 包。

3. 创建 WebSocket 处理程序

在项目的根目录下,创建一个名为 "WebSocketHandler.cs" 的文件,并在文件中添加以下代码:

using System;
using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;

namespace WebSocketExample
{
    public class WebSocketHandler
    {
        private readonly RequestDelegate _next;

        public WebSocketHandler(RequestDelegate next)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext context)
        {
            if (context.WebSockets.IsWebSocketRequest)
            {
                WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();
                await HandleWebSocket(webSocket);
            }
            else
            {
                await _next(context);
            }
        }

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

            while (!result.CloseStatus.HasValue)
            {
                string message = Encoding.UTF8.GetString(buffer, 0, result.Count);
                byte[] response = Encoding.UTF8.GetBytes("Received: " + message);

                await webSocket.SendAsync(new ArraySegment<byte>(response), WebSocketMessageType.Text, true, CancellationToken.None);

                result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
            }
            await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
        }
    }
}

在上面的代码中,我们创建了一个名为 "WebSocketHandler" 的类,实现了 Asp.NET 中的中间件接口。在 Invoke 方法中,我们判断请求是否是一个 WebSocket 请求,并调用 AcceptWebSocketAsync 方法接受 WebSocket 连接。然后,在 HandleWebSocket 方法中,我们使用循环来接收并处理来自客户端的消息,然后发送响应消息。

4. 配置 WebSocket 处理程序

打开 "Startup.cs" 文件,并在 Configure 方法中添加以下代码:

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

    app.UseRouting();

    app.UseWebSockets();
    app.UseMiddleware<WebSocketHandler>();

    // ...

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

在上面的代码中,我们通过调用 UseWebSockets 方法启用 WebSocket 支持,并使用 UseMiddleware 方法将我们刚才创建的 WebSocketHandler 中间件添加到请求处理管道中。

5. 创建 WebSocket 客户端

在项目的根目录下,创建一个名为 "WebSocketClient.html" 的文件,并在文件中添加以下代码:

<!DOCTYPE html>
<html>
<head>
    <title>WebSocket Client</title>
</head>
<body>
    <input type="text" id="messageInput" />
    <button onclick="sendMessage()">发送</button>
    <div id="messageContainer"></div>

    <script>
        var webSocket = new WebSocket("ws://localhost:5000");

        webSocket.onmessage = function(event) {
            var messageContainer = document.getElementById("messageContainer");
            var message = event.data;
            messageContainer.innerHTML += "<p>" + message + "</p>";
        };

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

在上面的代码中,我们创建了一个简单的 HTML 页面,包含一个文本框和一个按钮,用于发送消息,并在一个 div 元素中显示接收到的消息。当页面加载完成后,我们创建了一个 WebSocket 连接,并用 onmessage 事件处理程序来监听接收到的消息,将其添加到消息容器中。sendMessage 函数用于发送消息。

6. 启动应用并测试

在 Visual Studio 中按下 Ctrl + F5 启动应用程序,并在浏览器中打开刚创建的 WebSocketClient.html 文件。在文本框中输入一条消息,然后单击发送按钮,你会在页面上看到接收到的消息以及服务器返回的响应消息。

恭喜!你已经成功在 Asp.NET 中实现了 WebSocket 实时通讯。WebSocket 提供了一种高效、低延迟的通讯方式,适用于实现实时通讯、即时聊天、实时数据更新等场景。希望本篇博客能帮助你快速上手使用 WebSocket。

相似文章

    评论 (0)