//------------------------------------------------------------------------------ // 此代码版权(除特别声明或在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; } } }