C# 实现WebSocket服务端教程
1. 介绍
WebSocket 是一种在Web浏览器和Web服务器之间建立双向通信的技术。它允许服务器主动向客户端推送数据,而不需要客户端不断地发起请求。WebSocket 在实时应用程序中非常有用,例如在线聊天应用程序、股票市场实时报价等等。本教程将重点介绍如何使用 C# 实现一个 WebSocket 服务端。
2. 准备工作
2.1 安装 NuGet 包
首先,我们需要安装一个叫做 "Microsoft.AspNetCore.WebSockets" 的 NuGet 包。可以使用 Visual Studio NuGet 包管理器安装,或者使用以下命令在命令行中安装:
Install-Package Microsoft.AspNetCore.WebSockets
2.2 创建 WebSocket 服务端
接下来,我们需要创建一个 C# 类来实现 WebSocket 服务端。打开 Visual Studio,并创建一个新的类文件,命名为 "WebSocketServer.cs"。在此文件中,我们将编写我们的 WebSocket 服务端代码。
3. 编写代码
3.1 引入命名空间
首先,我们需要引入相关的命名空间:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.WebSockets;
using System;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
3.2 编写 WebSocket 中间件
接下来,我们需要编写一个 WebSocket 中间件,来处理 WebSocket 连接的建立和消息的传递。在代码文件中添加以下代码:
public class WebSocketServer
{
private readonly RequestDelegate _next;
public WebSocketServer(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.Invoke(context);
}
}
private async Task HandleWebSocket(WebSocket webSocket)
{
var buffer = new byte[1024 * 4];
while (webSocket.State == WebSocketState.Open)
{
var result = await webSocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);
if (result.MessageType == WebSocketMessageType.Close)
{
await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
}
else
{
// 处理接收到的消息
string message = Encoding.UTF8.GetString(buffer, 0, result.Count);
// TODO: 处理接收到的消息
}
}
}
}
3.3 配置中间件
接下来,我们需要在 Startup.cs 文件中进行中间件的配置。在 Configure 方法中添加以下代码:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// 省略其他中间件配置
app.UseWebSockets();
app.UseMiddleware<WebSocketServer>();
// 省略其他中间件配置
}
4. 启动服务端
现在我们已经完成了 WebSocket 服务端的编写和配置。接下来,我们需要启动服务端并等待客户端的连接。
4.1 编写入口文件
为了方便测试,我们可以编写一个简单的入口文件来启动服务端。创建一个新的类文件,命名为 "Program.cs",并添加以下代码:
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using System.Threading.Tasks;
namespace WebSocketServerExample
{
public class Program
{
public static async Task Main(string[] args)
{
await CreateHostBuilder(args).Build().RunAsync();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
4.2 启动服务端
现在我们可以运行程序,服务端就会启动并开始监听客户端的连接请求。可以使用浏览器或者其他 WebSocket 客户端工具来进行连接和通信。
5. 总结
通过本教程,我们学习了如何使用 C# 实现一个 WebSocket 服务端。我们首先介绍了 WebSocket 技术及其在实时应用程序中的作用。然后,我们学习了如何安装必要的 NuGet 包和创建 WebSocket 服务端的基本结构。最后,我们编写了一个 WebSocket 中间件并配置了服务端,然后启动了服务端并等待客户端的连接。希望本教程对你理解并实现 WebSocket 服务端有所帮助。
本教程同时适用于使用 .NET Core 和 .NET Framework 开发的 WebSocket 服务端。