You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
138 lines
5.6 KiB
138 lines
5.6 KiB
//------------------------------------------------------------------------------ |
|
// 此代码版权(除特别声明或在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 |
|
{ |
|
/// <summary> |
|
/// IPluginsManagerExtension |
|
/// </summary> |
|
public static class SocketPluginsManagerExtension |
|
{ |
|
/// <summary> |
|
/// 使用断线重连。 |
|
/// <para>该效果仅客户端在完成首次连接,且为被动断开时有效。</para> |
|
/// </summary> |
|
/// <param name="pluginsManager"></param> |
|
/// <param name="successCallback">成功回调函数</param> |
|
/// <param name="tryCount">尝试重连次数,设为-1时则永远尝试连接</param> |
|
/// <param name="printLog">是否输出日志。</param> |
|
/// <param name="sleepTime">失败时,停留时间</param> |
|
/// <returns></returns> |
|
public static IPluginsManager UseReconnection(this IPluginsManager pluginsManager, int tryCount = 10, |
|
bool printLog = false, int sleepTime = 1000, Action<ITcpClient> successCallback = null) |
|
{ |
|
bool first = true; |
|
var reconnectionPlugin = new ReconnectionPlugin<ITcpClient>(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; |
|
} |
|
|
|
/// <summary> |
|
/// 检查连接客户端活性插件。 |
|
/// <para>当在设置的周期内,没有接收/发送任何数据,则判定该客户端掉线。执行清理。默认配置:60秒为一个周期,同时检测发送和接收。</para> |
|
/// 仅服务器适用。 |
|
/// </summary> |
|
/// <param name="pluginsManager"></param> |
|
/// <returns></returns> |
|
public static CheckClearPlugin UseCheckClear(this IPluginsManager pluginsManager) |
|
{ |
|
return pluginsManager.Add<CheckClearPlugin>(); |
|
} |
|
|
|
/// <summary> |
|
/// 使用断线重连。 |
|
/// <para>该效果仅客户端在完成首次连接,且为被动断开时有效。</para> |
|
/// </summary> |
|
/// <param name="pluginsManager"></param> |
|
/// <param name="sleepTime">失败时间隔时间</param> |
|
/// <param name="failCallback">失败时回调(参数依次为:客户端,本轮尝试重连次数,异常信息)。如果回调为null或者返回false,则终止尝试下次连接。</param> |
|
/// <param name="successCallback">成功连接时回调。</param> |
|
/// <returns></returns> |
|
public static IPluginsManager UseReconnection(this IPluginsManager pluginsManager, int sleepTime, |
|
Func<ITcpClient, int, Exception, bool> failCallback, |
|
Action<ITcpClient> successCallback) |
|
{ |
|
bool first = true; |
|
var reconnectionPlugin = new ReconnectionPlugin<ITcpClient>(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; |
|
} |
|
} |
|
} |