//------------------------------------------------------------------------------
// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有
// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权
// CSDN博客:https://blog.csdn.net/qq_40374647
// 哔哩哔哩视频:https://space.bilibili.com/94253567
// Gitee源代码仓库:https://gitee.com/RRQM_Home
// Github源代码仓库:https://github.com/RRQM
// API首页:https://www.yuque.com/rrqm/touchsocket/index
// 交流QQ群:234762506
// 感谢您的下载和使用
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
using System;
using System.Collections.Concurrent;
using System.Threading.Tasks;
using TouchSocket.Core;
namespace TouchSocket.Sockets
{
///
/// Client工厂
///
public abstract class ClientFactory : DisposableObject where TClient : IClient
{
///
/// Client工厂
///
public ClientFactory()
{
this.MainConfig = new TouchSocketConfig();
}
///
/// 已创建的客户端安全列表,一般不要直接操作。
///
public ConcurrentList CreatedClients { get; } = new ConcurrentList();
///
/// 空闲客户端的安全队列,一般不要直接操作。
///
public ConcurrentQueue FreeClients { get; } = new ConcurrentQueue();
///
/// 主通信客户端。
///
public abstract TClient MainClient { get; }
///
/// 主客户端配置
///
///
public virtual TouchSocketConfig MainConfig { get; }
///
/// 最大客户端数量。默认10。
///
public int MaxCount { get; set; } = 10;
///
/// 池中维护的最小客户端数量。默认0。
///
public int MinCount { get; set; }
///
/// 检验主通信状态。最好在每次操作时都调用。
///
/// 如果状态异常,是否进行再次初始化
///
public abstract Result CheckStatus(bool tryInit = true);
///
/// 检验主通信状态。最好在每次操作时都调用。
///
/// 如果状态异常,是否进行再次初始化
///
public virtual Task CheckStatusAsync(bool tryInit = true)
{
return Task.Run(() =>
{
return this.CheckStatus(tryInit);
});
}
///
/// 清理池中的所有客户端。
///
///
public virtual Task ClearAsync()
{
return Task.Run(() =>
{
return this.Clear();
});
}
///
/// 清理池中的所有客户端。
///
///
public virtual int Clear()
{
int count = 0;
foreach (var item in this.CreatedClients)
{
count++;
DisposeClient(item);
}
FreeClients.Clear();
return count;
}
///
/// 释放客户端最后的调用。
///
///
public abstract void DisposeClient(TClient client);
///
/// 释放客户端最后的调用。
///
///
///
public virtual Task DisposeClientAsync(TClient client)
{
return Task.Run(() =>
{
this.DisposeClient(client);
});
}
///
/// 获取空闲可用的客户端数量。
///
public abstract int GetAvailableCount();
///
/// 获取用于传输的客户端。在此处返回的结果,必须完成基本初始化,例如连接等。
///
///
///
public abstract TClient GetTransferClient(TimeSpan waitTime);
///
/// 判断客户端是不是存活状态。
///
///
///
public abstract bool IsAlive(TClient client);
///
/// 释放使用完成的客户端
///
///
public abstract void ReleaseTransferClient(TClient client);
///
/// 释放使用完成的客户端
///
///
///
public virtual Task ReleaseTransferClientAsync(TClient client)
{
return Task.Run(() =>
{
this.ReleaseTransferClient(client);
});
}
///
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
DisposeClient(MainClient);
this.Clear();
}
///
/// 获取用于传输的客户端配置
///
///
protected abstract TouchSocketConfig GetTransferConfig();
}
}