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 FLY.OBJComponents.Client { /// /// 管理全部 XxxxServiceClient 的连接关系 /// [JsonObject(MemberSerialization.OptIn)] public class ObjServiceClientManager { NLog.ILogger logger = NLog.LogManager.GetCurrentClassLogger(); private static ObjServiceClientManager instance = null; public static ObjServiceClientManager Instance { get { if (instance == null) { instance = new ObjServiceClientManager(); instance.Load(); } return instance; } } [JsonProperty] public List ConnAddrs = new List(); [JsonProperty] public List ClientInfos = new List(); public UInt32 Connect_to_Another_OBJSys(string connName, string serviceName, FObj fObj) { //找到地址 var connaddr = ConnAddrs.Find(c => c.ConnName == connName); if (connaddr == null) { //没有!!!!,失败!!! logger.Error($"{connName}.{serviceName} 需要连接到服务器,但找不到 {connName}"); return 0; } //找服务Id var clientInfo = ClientInfos.Find(c => c.ConnName == connName && c.ServiceName == serviceName); if (clientInfo == null) { //没有!!!!,失败!!! logger.Error($"{connName}.{serviceName} 需要连接到服务器,但找不到 服务Id"); return 0; } clientInfo.ClientId = fObj.ID; connaddr.conn = FObjSys.Current.Connect_to_Another_OBJSys(connaddr.ep, clientInfo.ClientId); return clientInfo.ServiceId; } 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; } if (connaddr.conn != null) { var conn = connaddr.conn; if (!conn.RemoteEP.Equals(Misc.StringConverter.ToIPEndPoint(addr))) { //断开之前的连接 FObjSys.Current.Disconnect_to_Another_OBJSys(conn.RemoteEP, GetAllClientIds(connaddr.ConnName)); } } connaddr.conn = FObjSys.Current.Connect_to_Another_OBJSys(connaddr.ep, GetAllClientIds(connaddr.ConnName)); } UInt32[] GetAllClientIds(string connName) { return ClientInfos.FindAll(c => c.ConnName == connName && c.ClientId != 0).Select(c => c.ClientId).ToArray(); } string filename = "serviceManager.json"; public void Load() { if (File.Exists(filename)) { try { string json = File.ReadAllText(filename); JsonConvert.PopulateObject(json, this); if (this.ConnAddrs == null) this.ConnAddrs = new List(); if (this.ClientInfos == null) this.ClientInfos = new List(); } catch { } } } public void Save() { try { string json = JsonConvert.SerializeObject(this, Formatting.Indented); File.WriteAllText(filename, json); } catch { } } } public class ObjServiceClientInfo { /// /// 连接器名称 /// public string ConnName; /// /// 服务名称, 客户端 在 unity的名称 /// public string ServiceName; /// /// 服务Id /// public UInt32 ServiceId; [JsonIgnore] public UInt32 ClientId; } public class ConnAddr { /// /// 连接器名称 /// public string ConnName; /// /// 设备地址 /// public string Addr; public IPEndPoint ep { get { return Misc.StringConverter.ToIPEndPoint(Addr); } } [JsonIgnore] public TCPCConn conn; } }