net使用websocket 建立服务
时间: 2023-07-08 12:26:37 浏览: 45
在 .NET 中使用 WebSocket 建立服务需要进行以下步骤:
1. 创建一个 ASP.NET Core 项目或一个类库项目。
2. 在 NuGet 包管理器中添加 Microsoft.AspNetCore.WebSockets 包。
3. 在 Startup.cs 文件中添加 WebSocket 中间件。
4. 创建 WebSocket 处理程序,处理 WebSocket 连接的各种事件。
5. 在 ConfigureServices 方法中注册 WebSocket 处理程序。
6. 在 Configure 方法中使用 UseWebSockets 方法启用 WebSocket 中间件。
下面是一个简单的示例:
```csharp
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.WebSockets;
using Microsoft.Extensions.DependencyInjection;
using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;
namespace WebSocketDemo
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddWebSocketManager();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseWebSockets();
app.UseWebSocketManager();
}
}
public static class WebSocketExtensions
{
public static IServiceCollection AddWebSocketManager(this IServiceCollection services)
{
services.AddTransient<WebSocketHandler>();
return services;
}
public static IApplicationBuilder UseWebSocketManager(this IApplicationBuilder app)
{
var webSocketHandler = app.ApplicationServices.GetService<WebSocketHandler>();
app.Use(async (context, next) =>
{
if (context.Request.Path == "/ws")
{
if (context.WebSockets.IsWebSocketRequest)
{
WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();
await webSocketHandler.OnConnected(webSocket);
await webSocketHandler.Receive(webSocket, async (result, buffer) =>
{
if (result.MessageType == WebSocketMessageType.Text)
{
await webSocketHandler.ReceiveAsync(webSocket, result, buffer);
return;
}
if (result.MessageType == WebSocketMessageType.Close)
{
await webSocketHandler.OnDisconnected(webSocket);
return;
}
});
}
else
{
context.Response.StatusCode = 400;
}
}
else
{
await next();
}
});
return app;
}
}
public class WebSocketHandler
{
private readonly WebSocketConnectionManager _connectionManager = new WebSocketConnectionManager();
public async Task OnConnected(WebSocket webSocket)
{
await _connectionManager.AddWebSocket(webSocket);
}
public async Task OnDisconnected(WebSocket webSocket)
{
await _connectionManager.RemoveWebSocketAsync(_connectionManager.GetId(webSocket));
}
public async Task ReceiveAsync(WebSocket webSocket, WebSocketReceiveResult result, byte[] buffer)
{
string message = System.Text.Encoding.UTF8.GetString(buffer, 0, result.Count);
await SendToAllAsync(message);
}
public async Task SendAsync(WebSocket webSocket, string message)
{
if (webSocket.State != WebSocketState.Open)
{
return;
}
await webSocket.SendAsync(new System.ArraySegment<byte>(System.Text.Encoding.UTF8.GetBytes(message), 0, message.Length), WebSocketMessageType.Text, true, CancellationToken.None);
}
public async Task SendToAllAsync(string message)
{
foreach (var webSocket in _connectionManager.GetAll())
{
await SendAsync(webSocket, message);
}
}
}
public class WebSocketConnectionManager
{
private readonly System.Collections.Concurrent.ConcurrentDictionary<string, WebSocket> _sockets = new System.Collections.Concurrent.ConcurrentDictionary<string, WebSocket>();
public WebSocket GetWebSocketById(string id)
{
return _sockets.TryGetValue(id, out WebSocket socket) ? socket : null;
}
public void AddSocket(WebSocket socket)
{
_sockets.TryAdd(CreateConnectionId(), socket);
}
public async Task RemoveWebSocketAsync(string id)
{
_sockets.TryRemove(id, out WebSocket socket);
await socket.CloseAsync(closeStatus: WebSocketCloseStatus.NormalClosure,
statusDescription: "Closed by the WebSocketManager",
cancellationToken: CancellationToken.None);
}
public IEnumerable<WebSocket> GetAll()
{
return _sockets.Values;
}
public string GetId(WebSocket socket)
{
return _sockets.FirstOrDefault(p => p.Value == socket).Key;
}
private string CreateConnectionId()
{
return Guid.NewGuid().ToString();
}
}
}
```
这是一个简单的 WebSocket 服务,当客户端连接到 ws://localhost/ws 时,会触发 OnConnected 方法,当客户端断开连接时,会触发 OnDisconnected 方法。在 ReceiveAsync 方法中,处理接收到的消息,并通过 SendToAllAsync 方法将消息发送给所有连接的客户端。