using FObjBase; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; namespace FObjBase { /// /// 管理全部 XxxxServiceClient 的连接关系 /// [JsonObject(MemberSerialization.OptIn)] public class FObjServiceClientManager { NLog.ILogger logger = NLog.LogManager.GetCurrentClassLogger(); private static FObjServiceClientManager instance = null; /// /// 全局管理器 /// public static FObjServiceClientManager Instance { get { if (instance == null) { instance = new FObjServiceClientManager(); instance.Load(); } return instance; } } /// /// 连接地址 /// [JsonProperty] public List ConnAddrs { get; } = new List(); /// /// 默认地址 /// List DefaultAddrs { get; } = new List(); /// /// 连接到 另一个Obj系统 /// /// /// /// public void Connect_to_Another_OBJSys(string connName, FObjServiceClient fObjClient) { //找到地址 var connaddr = ConnAddrs.Find(c => c.ConnName == connName); if (connaddr == null) { string addr = "0.0.0.1:12345";//没有默认值,创建连接到不存在的地址,避免出错 //没有,那就创建一个 //查找默认值 var defaultAddr = DefaultAddrs.Find(c => c.ConnName == connName); if (defaultAddr != null) addr = defaultAddr.Addr; connaddr = new ConnAddr() { ConnName = connName, Addr = addr }; ConnAddrs.Add(connaddr); } foreach (var id in fObjClient.GetIDs()) { if (!connaddr.ClientIds.Contains(id)) { connaddr.ClientIds.Add(id); connaddr.Conn = FObjSys.Current.Connect_to_Another_OBJSys(connaddr.ep, id); } } } /// /// 客户端注销时通知 /// /// public void ObjClientDisponse(FObjServiceClient fObjClient) { if (string.IsNullOrEmpty(fObjClient.ConnName)) return; var connaddr = ConnAddrs.Find(c => c.ConnName == fObjClient.ConnName); connaddr.ClientIds.RemoveAll(id => fObjClient.GetIDs().Contains(id)); } /// /// 重连 /// /// /// public void ReConnect(string connName, string addr) { //找到地址 var connaddr = ConnAddrs.Find(c => c.ConnName == connName); if (connaddr == null) { //没有!!!!,失败!!! logger.Error($"ReConnect({connaddr},{addr}), 不能找到 ConnAddr"); return; } connaddr.Addr = addr; if (connaddr.Conn != null) { var conn = connaddr.Conn; if (!conn.RemoteEP.Equals(connaddr.ep)) { //断开之前的连接 FObjSys.Current.Disconnect_to_Another_OBJSys(conn.RemoteEP, connaddr.ClientIds.ToArray()); } } connaddr.Conn = FObjSys.Current.Connect_to_Another_OBJSys(connaddr.ep, connaddr.ClientIds.ToArray()); } string filename = "serviceManager.json"; string file_default_path = "default/serviceManager.default.json"; void LoadDefault() { if (!File.Exists(file_default_path)) return; try { string json = File.ReadAllText(file_default_path); var p = JsonConvert.DeserializeObject>(json); DefaultAddrs.AddRange(p); } catch(Exception e) { } } /// /// 加载配置 /// void Load() { LoadDefault(); if (File.Exists(filename)) { try { string json = File.ReadAllText(filename); JsonConvert.PopulateObject(json, this); } catch { } } } /// /// 保存配置 /// public void Save() { try { string json = JsonConvert.SerializeObject(this, Formatting.Indented); File.WriteAllText(filename, json); } catch { } } } /// /// 连接地址 /// [JsonObject(MemberSerialization.OptIn)] public class ConnAddr { /// /// 连接器名称 /// [JsonProperty] public string ConnName; /// /// 设备地址 /// [JsonProperty] public string Addr; /// /// EndPoint /// public IPEndPoint ep { get { return Misc.StringConverter.ToIPEndPoint(Addr); } } /// /// 连接 /// public TCPCConn Conn; /// /// 客户端 服务代理Id /// public List ClientIds = new List(); } public class ConnDefaultAddr { /// /// 连接器名称 /// public string ConnName; /// /// 设备地址 /// public string Addr; } }