//------------------------------------------------------------------------------
// 此代码版权(除特别声明或在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.Threading;
using TouchSocket.Sockets;
namespace TouchSocket.Core
{
///
/// IPluginsManagerExtension
///
public static class SocketPluginsManagerExtension
{
///
/// 使用断线重连。
/// 该效果仅客户端在完成首次连接,且为被动断开时有效。
///
///
/// 成功回调函数
/// 尝试重连次数,设为-1时则永远尝试连接
/// 是否输出日志。
/// 失败时,停留时间
///
public static IPluginsManager UseReconnection(this IPluginsManager pluginsManager, int tryCount = 10,
bool printLog = false, int sleepTime = 1000, Action successCallback = null)
{
bool first = true;
var reconnectionPlugin = new ReconnectionPlugin(client =>
{
int tryT = tryCount;
while (tryCount < 0 || tryT-- > 0)
{
try
{
if (client.Online)
{
return true;
}
else
{
if (first) Thread.Sleep(1000);
first = false;
client.Connect();
first = true;
}
successCallback?.Invoke(client);
return true;
}
catch (Exception ex)
{
if (printLog)
{
client.Logger.Log(LogType.Error, client, "断线重连失败。", ex);
}
Thread.Sleep(sleepTime);
}
}
return true;
});
pluginsManager.Add(reconnectionPlugin);
return pluginsManager;
}
///
/// 检查连接客户端活性插件。
/// 当在设置的周期内,没有接收/发送任何数据,则判定该客户端掉线。执行清理。默认配置:60秒为一个周期,同时检测发送和接收。
/// 仅服务器适用。
///
///
///
public static CheckClearPlugin UseCheckClear(this IPluginsManager pluginsManager)
{
return pluginsManager.Add();
}
///
/// 使用断线重连。
/// 该效果仅客户端在完成首次连接,且为被动断开时有效。
///
///
/// 失败时间隔时间
/// 失败时回调(参数依次为:客户端,本轮尝试重连次数,异常信息)。如果回调为null或者返回false,则终止尝试下次连接。
/// 成功连接时回调。
///
public static IPluginsManager UseReconnection(this IPluginsManager pluginsManager, int sleepTime,
Func failCallback,
Action successCallback)
{
bool first = true;
var reconnectionPlugin = new ReconnectionPlugin(client =>
{
int tryT = 0;
while (true)
{
try
{
if (client.Online)
{
return true;
}
else
{
if (first) Thread.Sleep(1000);
first = false;
client.Connect();
first = true;
}
successCallback?.Invoke(client);
return true;
}
catch (Exception ex)
{
Thread.Sleep(sleepTime);
if (failCallback?.Invoke(client, ++tryT, ex) != true)
{
return true;
}
}
}
});
pluginsManager.Add(reconnectionPlugin);
return pluginsManager;
}
}
}