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

相关推荐
ZoeLandia7 小时前
WebSocket | 背景 概念 原理 使用 优缺点及适用场景
网络·websocket·网络协议
zquwei17 小时前
SpringCloudGateway+Nacos注册与转发Netty+WebSocket
java·网络·分布式·后端·websocket·网络协议·spring
carterslam1 天前
解决:websocket 1002 connection rejected 426upgrade required
网络·websocket·网络协议
抓住鼹鼠不撒手1 天前
xterm.js结合websocket实现web ssh
前端·javascript·websocket
学前端的小朱1 天前
Echarts实现大屏可视化
websocket·echarts·nodejs·vue3·vite·koa·cors
码农君莫笑1 天前
Blazor项目中使用EF读写 SQLite 数据库
linux·数据库·sqlite·c#·.netcore·人机交互·visual studio
_oP_i1 天前
.NET Core 项目配置到 Jenkins
运维·jenkins·.netcore
龙少95433 天前
【Http,Netty,Socket,WebSocket的应用场景和区别】
java·后端·websocket·网络协议·http
m0_748232923 天前
前端在WebSocket中加入Token
前端·websocket·网络协议
等一场春雨3 天前
react websocket 全局访问和响应
前端·websocket·react.js