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;
}
}