在.NET 8中,使用WebSocket进行实时通信是一种高效的方式,尤其适用于需要实时数据交换的应用场景,比如聊天应用、在线游戏、股票行情推送等。WebSocket是一种持久连接的协议,可以在客户端和服务器之间进行双向通信。接下来,我们将通过一个简单的示例来展示如何在.NET 8 Web API中实现WebSocket通信。

环境准备

确保您已安装.NET 8 SDK。如果还没有,可以前往官方页面下载并安装。另外,您可以使用Visual Studio或Visual Studio Code进行开发。

创建项目

首先,我们需要创建一个新的Web API项目。在命令行中运行以下命令:

dotnet new webapi -n WebSocketDemo
cd WebSocketDemo

修改启动配置

打开Program.cs文件,我们将在其中配置WebSocket支持。代码如下:

using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;

var builder = WebApplication.CreateBuilder(args);

// 添加服务
builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowAll", builder =>
    {
        builder.AllowAnyOrigin()
               .AllowAnyMethod()
               .AllowAnyHeader();
    });
});

var app = builder.Build();

// 启用CORS
app.UseCors("AllowAll");

// WebSocket中间件
app.UseWebSockets();

app.MapGet("/", () => "WebSocket Demo");

app.Map("/ws", async (HttpContext context) =>
{
    if (context.WebSockets.IsWebSocketRequest)
    {
        WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();
        await Echo(webSocket);
    }
    else
    {
        context.Response.StatusCode = 400;
    }
});

// 回声示例方法
async Task Echo(WebSocket webSocket)
{
    var buffer = new byte[1024 * 4];

    while (webSocket.State == WebSocketState.Open)
    {
        WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
        var message = System.Text.Encoding.UTF8.GetString(buffer, 0, result.Count);

        // 将接收到的消息发送回去
        var echoMessage = $"你发送的消息是:{message}";
        var byteMessage = System.Text.Encoding.UTF8.GetBytes(echoMessage);
        await webSocket.SendAsync(new ArraySegment<byte>(byteMessage), WebSocketMessageType.Text, true, CancellationToken.None);
    }
}

app.Run();

代码解析

  1. CORS设置:通过添加CORS策略AllowAll,允许所有来源的请求。这样可以在本地开发时避免跨域问题。

  2. WebSocket中间件:使用app.UseWebSockets()来启用WebSocket中间件。

  3. WebSocket端点:我们在app.Map("/ws", ...)中定义了一个WebSocket的端点。当客户端连接到/ws时,我们接受这个WebSocket连接。

  4. 回声逻辑Echo方法实现了一个简单的回声功能,即将客户连接发送的消息原封不动地返回给客户端。它会持续接收消息,直到WebSocket关闭。

客户端实现

为了测试这个WebSocket服务,我们可以使用JavaScript编写一个简单的客户端。在wwwroot文件夹中创建一个index.html文件,内容如下:

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>WebSocket Demo</title>
</head>
<body>
    <h1>WebSocket Demo</h1>
    <input type="text" id="message" placeholder="输入消息" />
    <button onclick="sendMessage()">发送</button>
    <div id="output"></div>

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

        socket.onmessage = function(event) {
            const output = document.getElementById('output');
            output.innerHTML += `<p>${event.data}</p>`;
        };

        function sendMessage() {
            const input = document.getElementById('message');
            const message = input.value;
            socket.send(message);
            input.value = ''; // 清空输入框
        }
    </script>
</body>
</html>

测试

  1. 在项目目录下运行应用程序:

bash dotnet run

  1. 打开浏览器,访问http://localhost:5000/index.html(确保静态文件服务正常)。

  2. 在输入框中输入消息并点击“发送”按钮,您将看到服务端返回的消息在页面上显示。

总结

使用.NET 8实现WebSocket通信非常简单。通过上述例子,我们展示了如何创建一个WebSocket服务,并与客户端进行双向通信。您可以基于这个基础,扩展出更复杂的实时应用。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部