using System; using System.Collections.Generic; using System.Linq; using System.Text; using HuizhongLibrary.Log; namespace HuizhongLibrary.Network { #region 消息对象 public class SocketMessage { private int m_MessageID; public int MessageID { get { return m_MessageID; } set { m_MessageID = value; } } private string m_SequenceID; public string SequenceID { get { return m_SequenceID; } set { m_SequenceID = value; } } private byte[] m_Bytes; public byte[] Bytes { get { return m_Bytes; } set { m_Bytes = value; } } public string Data { get; set; } private int m_SendLength = 0; public int SendLength { get { return m_SendLength; } set { m_SendLength = value; } } private DateTime m_SendTime; public DateTime SendTime { get { return m_SendTime; } set { m_SendTime = value; } } private string m_IpAddress; public string IpAddress { get { return m_IpAddress; } set { m_IpAddress = value; } } private string m_DeviceNo; public string DeviceNo { get { return m_DeviceNo; } set { m_DeviceNo = value; } } private string m_FunNo; public string FunNo { get { return m_FunNo; } set { m_FunNo = value; } } private int m_SendNumber; public int SendNumber { get { return m_SendNumber; } set { m_SendNumber = value; } } private bool m_IsRevert; /// /// 是否要求回复 /// public bool IsRevert { get { return m_IsRevert; } set { m_IsRevert = value; } } private bool m_Enabled; public bool Enabled { get { return m_Enabled; } set { m_Enabled = value; } } private bool m_IsLock; public bool IsLock { get { return m_IsLock; } set { m_IsLock = value; } } public SocketMessage() { MessageID = 0; SendNumber = 0; SendTime = DateTime.Now.AddMinutes(-1); Enabled = true; DeviceNo = ""; IpAddress = ""; Data = ""; IsRevert = true; IsLock = false; } public SocketMessage Copy() { SocketMessage Model = new SocketMessage(); Model.MessageID = MessageID; Model.Bytes = Bytes; Model.Data = Data; Model.SendTime = SendTime; Model.FunNo = FunNo; Model.SequenceID = SequenceID; Model.DeviceNo = DeviceNo; Model.IpAddress = IpAddress; Model.SendNumber = SendNumber; Model.Enabled = Enabled; Model.IsRevert = IsRevert; Model.IsLock = IsLock; Model.SendLength = SendLength; return Model; } } #endregion #region 消息对象列表 public class SocketMessages { public List ListModel = new List(); public bool IsEmployMessages = false; #region 消息数 public int Count { get { lock (ListModel) { try { return ListModel.Count; } catch (Exception ex) { ErrorFollow.TraceWrite(ex.TargetSite.Name, ex.StackTrace, ex.Message); } } return 0; } } #endregion #region 新增消息 public void Add(SocketMessage item) { if (item == null) return; lock (ListModel) { try { ListModel.Add(item); } catch (Exception ex) { ErrorFollow.TraceWrite(ex.TargetSite.Name, ex.StackTrace, ex.Message); } } } #endregion #region 使消息无效 public int Employ(string SequenceID) { lock (ListModel) { try { for (int i = 0; i < ListModel.Count; i++) { var model = ListModel[i]; if (model == null) continue; if (model.SequenceID == SequenceID) { IsEmployMessages = true; model.Enabled = false; return model.MessageID; } } } catch (Exception ex) { ErrorFollow.TraceWrite(ex.TargetSite.Name, ex.StackTrace, ex.Message); } } return 0; } #endregion #region 移除无效的消息 public void RemoveEmploy() { lock (ListModel) { try { ListModel.RemoveAll(m => m.Enabled == false); IsEmployMessages = false; } catch (Exception ex) { ErrorFollow.TraceWrite(ex.TargetSite.Name, ex.StackTrace, ex.Message); } } } #endregion #region 返回要发送的消息 public SocketMessage GetNextSocketMessage(int RefshSecond) { lock (ListModel) { try { SocketMessage model = null; for (int i = 0; i < ListModel.Count; i++) { model = ListModel[i]; if (model.Enabled == false) continue; if (model.IsLock == true && i > 0) { return null; } if (model.SendTime.AddSeconds(RefshSecond) <= DateTime.Now) { return model; } else { if (model.IsLock == true && i == 0) return null; } } } catch (Exception ex) { ErrorFollow.TraceWrite(ex.TargetSite.Name, ex.StackTrace, ex.Message); } } return null; } #endregion #region 根据流水号返回消息 public SocketMessage GetSocketMessage(string SequenceID) { lock (ListModel) { try { SocketMessage model = null; SocketMessage model2 = null; for (int i = 0; i < this.ListModel.Count; i++) { model2 = this.ListModel[i]; if (model2.SequenceID == SequenceID) { model = model2; break; } } return model; } catch (Exception ex) { ErrorFollow.TraceWrite(ex.TargetSite.Name, ex.StackTrace, ex.Message); } } return null; } #endregion #region 清除全部消息 public void Clear() { lock (ListModel) { try { ListModel.Clear(); } catch (Exception ex) { ErrorFollow.TraceWrite(ex.TargetSite.Name, ex.StackTrace, ex.Message); } } } #endregion #region 移除并返回一个对象 public SocketMessage CheckOut(string SequenceID) { lock (ListModel) { try { SocketMessage model = null; for (int i = 0; i < this.ListModel.Count; i++) { if (this.ListModel[i].SequenceID == SequenceID) { model = this.ListModel[i]; this.ListModel.RemoveAt(i); break; } } return model; } catch (Exception ex) { ErrorFollow.TraceWrite(ex.TargetSite.Name, ex.StackTrace, ex.Message); } } return null; } #endregion #region 返回顶部的消息延迟时间 public int PeekInterval(int RefshSecond) { lock (ListModel) { try { TimeSpan ts = ListModel[0].SendTime.AddSeconds(RefshSecond) - DateTime.Now; return Convert.ToInt32(ts.TotalMilliseconds); } catch (Exception ex) { ErrorFollow.TraceWrite(ex.TargetSite.Name, ex.StackTrace, ex.Message); } } return 0; } #endregion #region 移除并返回一个对象 public SocketMessage CheckOut() { lock (ListModel) { try { if (ListModel.Count == 0) return null; SocketMessage model = ListModel[0]; ListModel.RemoveAt(0); return model; } catch (Exception ex) { ErrorFollow.TraceWrite("SocketMessages.CheckOut", ex.StackTrace, ex.Message); } } return null; } #endregion #region 移除并返回一个对象 public void Remove(string FunNo) { lock (ListModel) { try { this.ListModel.RemoveAll(m => m.FunNo == FunNo); //for (int i = this.ListModel.Count - 1; i >= 0; i--) //{ // if (this.ListModel[i].FunNo == FunNo) // { // this.ListModel.RemoveAt(i); // } //} } catch (Exception ex) { ErrorFollow.TraceWrite("SocketMessages.Remove", ex.StackTrace, ex.Message); } } } #endregion #region 移除设备消息 public void Clear(string DeviceNo) { if (string.IsNullOrEmpty(DeviceNo) == true) return; lock (ListModel) { try { ListModel.RemoveAll(m => m.DeviceNo == DeviceNo); } catch (Exception ex) { ErrorFollow.TraceWrite(ex.TargetSite.Name, ex.StackTrace, ex.Message); } } } #endregion } #endregion #region 消息缓存池 public class SocketMessagePool { Queue argsPool; public bool IsRead = false; public SocketMessagePool() { argsPool = new Queue(); IsRead = true; } #region 新增对象 public void CheckIn(SocketMessage item) { lock (argsPool) { try { argsPool.Enqueue(item); } catch (Exception ex) { ErrorFollow.TraceWrite(ex.TargetSite.Name, ex.StackTrace, ex.Message); } } } #endregion #region 返回对象 public SocketMessage CheckOut() { lock (argsPool) { try { if (argsPool.Count == 0) return null; return argsPool.Dequeue(); } catch (Exception ex) { ErrorFollow.TraceWrite(ex.TargetSite.Name, ex.StackTrace, ex.Message); } return null; } } #endregion #region 返回缓存数量 public int Available { get { lock (argsPool) { try { return argsPool.Count; } catch (Exception ex) { ErrorFollow.TraceWrite(ex.TargetSite.Name, ex.StackTrace, ex.Message); } return 0; } } } #endregion #region 移除 public void Clear() { lock (argsPool) { try { argsPool.Clear(); } catch (Exception ex) { ErrorFollow.TraceWrite(ex.TargetSite.Name, ex.StackTrace, ex.Message); } } } #endregion } #endregion #region 设备缓存 public class ServerConnectionPools { Dictionary argsPool=new Dictionary(); #region 新增对象 public void CheckIn(string DeviceNo,ServerConnection item) { lock (argsPool) { try { if (argsPool.ContainsKey(DeviceNo) == true) { argsPool[DeviceNo] = item; return; } argsPool.Add(DeviceNo,item); } catch (Exception ex) { ErrorFollow.TraceWrite(ex.TargetSite.Name, ex.StackTrace, ex.Message); } } } #endregion #region 返回对象 public ServerConnection CheckOut(string DeviceNo) { lock (argsPool) { try { if (argsPool.Count == 0) return null; ServerConnection model=null; bool bk= argsPool.TryGetValue(DeviceNo,out model); if (bk == true && model != null) return model; } catch (Exception ex) { ErrorFollow.TraceWrite(ex.TargetSite.Name, ex.StackTrace, ex.Message); } return null; } } #endregion #region 移除 public void Remove(string DeviceNo) { lock (argsPool) { try { argsPool.Remove(DeviceNo); } catch (Exception ex) { ErrorFollow.TraceWrite(ex.TargetSite.Name, ex.StackTrace, ex.Message); } } } #endregion #region 移除 public void Clear() { lock (argsPool) { try { argsPool.Clear(); } catch (Exception ex) { ErrorFollow.TraceWrite(ex.TargetSite.Name, ex.StackTrace, ex.Message); } } } #endregion #region 清除已断开连接 public void RemoveEnabled() { lock (argsPool) { try { var argsPool2 = new Dictionary(); foreach (var item in argsPool.Values) { if (item.Enabled == false) continue; if (argsPool2.ContainsKey(item.DeviceNo + ":" + item.Port) == true) continue; argsPool2.Add(item.DeviceNo + ":" + item.Port, item); } argsPool = argsPool2; } catch (Exception ex) { ErrorFollow.TraceWrite(ex.TargetSite.Name, ex.StackTrace, ex.Message); } } } #endregion } #endregion }