75 lines
2.3 KiB
C#
75 lines
2.3 KiB
C#
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 _);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|