75 lines
2.3 KiB
C#
Raw Normal View History

using System.Collections.Concurrent;
using System.Net.WebSockets;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Syc.Basic.Web.WMS
{
// WebSocketManager.cs
public class WebSocketManager
{
private readonly ConcurrentDictionary<string,System.Net.WebSockets.WebSocket> _sockets = new();
private static Lazy<WebSocketManager> socketManager = new Lazy<WebSocketManager>(() => new WebSocketManager());
public static WebSocketManager SocketManager => socketManager.Value;
public void AddSocket(System.Net.WebSockets.WebSocket socket, string connectionId)
{
_sockets.TryAdd(connectionId, socket);
}
public async Task RemoveSocket(string connectionId)
{
if (_sockets.TryRemove(connectionId, out var socket))
{
await socket.CloseAsync(
WebSocketCloseStatus.NormalClosure,
"Connection closed",
CancellationToken.None);
}
}
public async Task SendMessageAsync(string connectionId, string message)
{
if (_sockets.TryGetValue(connectionId, out var socket))
{
var buffer = Encoding.UTF8.GetBytes(message);
await socket.SendAsync(
new ArraySegment<byte>(buffer),
WebSocketMessageType.Text,
true,
CancellationToken.None);
}
}
public async Task BroadcastAsync(string message)
{
List<string> keys = new List<string>();
foreach (var pair in _sockets)
{
if (pair.Value.State == WebSocketState.Open)
{
try
{
await SendMessageAsync(pair.Key, message);
}
catch (Exception ex)
{
keys.Add(pair.Key);
}
}
}
if (keys.Any())
{
foreach (var item in keys)
{
_sockets.Remove(item,out _);
}
}
}
}
}