好的,让我们来实现一个简单的 WebSocket 客户端和服务器端通信的应用程序,需要使用 C# 和 Visual Studio 2022。
首先,我们需要创建一个空的 ASP.NET Core Web Application 项目并将其命名为“WebSocketDemo”。在 Visual Studio 2022 中,选择“文件”菜单,然后选择“新建”和“项目”。
在“新建项目”窗口中,选择“ASP.NET Core Web 应用程序”并单击“下一步”。
然后,选择“Web 应用程序”模板并将应用程序命名为“WebSocketDemo”。单击“创建”按钮创建项目。
接下来,我们需要在项目中引入WebSocket相关的库。在Visual Studio 2022中,打开“解决方案资源管理器”,右键点击“WebSocketDemo”项目,选择“管理NuGet程序包”。
在“NuGet包管理器”中搜索“Microsoft.AspNetCore.WebSockets”,选择“Microsoft.AspNetCore.WebSockets”并安装它。
安装完成后,我们需要添加一个 WebSocketController 来处理客户端和服务器端的通信。在项目的 Controllers 目录下,添加一个名为 “WebSocketController.cs”的控制器。以下是示例代码:
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.WebSockets;
using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;
namespace WebSocketDemo.Controllers
{
[ApiController]
[Route("[controller]")]
public class WebSocketController : ControllerBase
{
private readonly WebSocketHandler _webSocketHandler;
public WebSocketController(WebSocketHandler webSocketHandler)
{
_webSocketHandler = webSocketHandler;
}
[HttpGet("/{id}")]
public async Task Get(string id)
{
if (HttpContext.WebSockets.IsWebSocketRequest)
{
WebSocket webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync();
_webSocketHandler.OnConnected(id, webSocket);
await _webSocketHandler.Receive(webSocket, async (result, buffer) =>
{
if (result.MessageType == WebSocketMessageType.Text)
{
await _webSocketHandler.OnMessage(id, result, buffer);
}
else if (result.MessageType == WebSocketMessageType.Close)
{
await _webSocketHandler.OnDisconnected(id, webSocket);
}
});
}
else
{
HttpContext.Response.StatusCode = 400;
}
}
}
public class WebSocketHandler
{
public async Task OnConnected(string id, WebSocket webSocket)
{
// 处理新的连接
}
public async Task Receive(WebSocket webSocket, System.Func<WebSocketReceiveResult, byte[], Task> handleMessage)
{
var buffer = new byte[1024 * 4];
while (webSocket.State == WebSocketState.Open)
{
var result = await webSocket.ReceiveAsync(new System.ArraySegment<byte>(buffer), CancellationToken.None);
await handleMessage(result, buffer);
}
}
public async Task OnMessage(string id, WebSocketReceiveResult result, byte[] buffer)
{
// 处理消息
}
public async Task OnDisconnected(string id, WebSocket webSocket)
{
// 处理连接断开
}
}
}
在代码中,我们提供了一个 WebSocketController, 用于处理客户端的请求。在 Get 方法中,我们检查当前接受的请求是否是 WebSocket 请求。如果是,在 OnConnected 方法中将 WebSocket 添加到 WebSocketHandler 的连接列表中。
然后,在 Receive 方法中获取连接的数据,通过 OnMessage 处理收到的消息,并在 OnDisconnected 方法中删除 WebSocket 连接。
请注意,这里的 WebSocketHandler 可以添加更多逻辑和方法,以处理从客户端接收到的不同数据。
最后,我们需要在 Startup.cs 文件中注册 WebSocket 相关依赖项。在 ConfigureServices 方法中,将以下代码添加到 services.AddControllers() 之后。
services.AddWebSocketManager();
然后,为 WebSocketHandler 添加服务:
services.AddSingleton<WebSocketHandler>();
最后,在 Configure 方法中,添加以下代码:
app.UseWebSockets();
app.MapWebSocketManager("/ws", serviceProvider.GetService<WebSocketHandler>());
此代码使用 UseWebSocket 和 MapWebSocketManager 方法将 WebSocketHandler 实例挂钩到WebSocket 请求的 WebSocket 路径(‘ws’)上。完成后,项目准备好进行测试!
运行应用程序后,您可以使用任何现代浏览器作为 WebSocket 客户端并连接到您的服务器(例如,可以使用 Chrome、Firefox 或 Edge)。如要进行测试,可以使用 JavaScript 中的 WebSocket API, 可以使用以下代码:
const socket = new WebSocket('ws://localhost:5000/ws/123')
socket.addEventListener('open', (event) => {
console.log('WebSocket connected')
})
socket.addEventListener('message', (event) => {
console.log(`Message: ${event.data}`)
})
socket.send('Hello, WebSocket!')
这里的 ‘ws://localhost:5000/ws/123’ 中,最后的 /123 是一个自定义值,为WebSocket客户端提供了一个身份标识。您可以随意更改此值或使用不同的标识符。
在浏览器中打开开发者工具并在控制台中执行上面的代码,您将看到消息“Hello, WebSocket!”通过您的 WebSocket 连接发送到服务器。将 WebSocketController.cs 的 OnMessage 方法中的代码替换为以下内容,可以回复上面发送的消息。
await webSocket.SendAsync(buffer, result.MessageType, true, CancellationToken.None);
这就是一个简单的 WebSocket 客户端和服务器端通信的应用程序,您可以在此基础上进一步进行扩展。