2025-02-24 09:50:17 +00:00
|
|
|
|
|
2025-02-21 01:14:39 +00:00
|
|
|
|
|
|
|
|
|
namespace ZhiYi.Core.Application.Services.Implements
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 客户端连接管理
|
|
|
|
|
/// </summary>
|
|
|
|
|
public class ConnectionClientManagerService : IConnectionClientManagerService
|
|
|
|
|
{
|
2025-02-24 09:50:17 +00:00
|
|
|
|
private readonly ConcurrentDictionary<string, IWebSocket> dic = new();
|
|
|
|
|
private readonly IDatabase _redis;
|
|
|
|
|
|
|
|
|
|
public ConnectionClientManagerService(
|
|
|
|
|
IConnectionMultiplexer connectionMultiplexer
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
_redis = connectionMultiplexer.GetDatabase();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-02-21 01:14:39 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 添加客户端
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="clientId">客户端ID</param>
|
|
|
|
|
/// <param name="webSocket"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public Task AddAsync(string clientId, IWebSocket webSocket)
|
|
|
|
|
{
|
|
|
|
|
if (!clientId.IsNullOrEmpty())
|
|
|
|
|
{
|
2025-02-24 09:50:17 +00:00
|
|
|
|
_redis.StringSet($"client", clientId);
|
2025-02-21 01:14:39 +00:00
|
|
|
|
dic.AddOrUpdate(clientId, webSocket);
|
|
|
|
|
}
|
|
|
|
|
return Task.CompletedTask;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 指定客户端发送消息
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="clientId">客户端ID</param>
|
|
|
|
|
/// <param name="message">消息内容</param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public async Task<bool> SendAsync(string clientId, string message)
|
|
|
|
|
{
|
|
|
|
|
if (dic.TryGetValue(clientId, out var webSocket))
|
|
|
|
|
{
|
|
|
|
|
await webSocket.SendAsync(message);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 广播消息
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="message"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public async Task<bool> SendAllAsync(string message)
|
|
|
|
|
{
|
|
|
|
|
if (dic.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
foreach (var d in dic)
|
|
|
|
|
{
|
|
|
|
|
await d.Value.SendAsync(message);
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 移除客户端并释放资源
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="clientId">客户端ID</param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public Task RemoveAsync(string clientId)
|
|
|
|
|
{
|
|
|
|
|
if(dic.TryRemove(clientId,out var webSocket))
|
|
|
|
|
{
|
|
|
|
|
webSocket.SafeDispose();
|
|
|
|
|
}
|
|
|
|
|
return Task.CompletedTask;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|