PushGroupClient.cs 5.29 KB
using HslCommunication.Core.Net;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HslCommunication.Core;




namespace HslCommunication.Enthernet
{
    /// <summary>
    /// 订阅分类的核心组织对象
    /// </summary>
    public class PushGroupClient : IDisposable
    {

        #region Constructor

        /// <summary>
        /// 实例化一个默认的对象
        /// </summary>
        public PushGroupClient()
        {
            appSessions = new List<AppSession>( );
            simpleHybird = new SimpleHybirdLock( );
        }


        #endregion

        #region Public Method

        /// <summary>
        /// 新增一个订阅的会话
        /// </summary>
        /// <param name="session">会话</param>
        public void AddPushClient(AppSession session)
        {
            simpleHybird.Enter( );
            appSessions.Add( session );
            simpleHybird.Leave( );
        }

        /// <summary>
        /// 移除一个订阅的会话
        /// </summary>
        /// <param name="clientID">客户端唯一的ID信息</param>
        public bool RemovePushClient( string clientID )
        {
            bool result = false;
            simpleHybird.Enter( );
            for (int i = 0; i < appSessions.Count; i++)
            {
                if(appSessions[i].ClientUniqueID == clientID)
                {
                    appSessions[i].WorkSocket?.Close( );
                    appSessions.RemoveAt( i );
                    result = true;
                    break;
                }
            }
            simpleHybird.Leave( );

            return result;
        }

        /// <summary>
        /// 使用固定的发送方法将数据发送出去
        /// </summary>
        /// <param name="content">数据内容</param>
        /// <param name="send">指定的推送方法</param>
        public void PushString( string content, Action<AppSession, string> send )
        {
            simpleHybird.Enter( );

            System.Threading.Interlocked.Increment( ref pushTimesCount );
            for (int i = 0; i < appSessions.Count; i++)
            {
                send( appSessions[i], content );
            }
            simpleHybird.Leave( );
        }

        /// <summary>
        /// 移除并关闭所有的客户端
        /// </summary>
        public int RemoveAllClient( )
        {
            int result = 0;
            simpleHybird.Enter( );

            for (int i = 0; i < appSessions.Count; i++)
            {
                appSessions[i].WorkSocket?.Close( );
            }

            result = appSessions.Count;

            appSessions.Clear( );
            simpleHybird.Leave( );

            return result;
        }

        /// <summary>
        /// 获取是否推送过数据
        /// </summary>
        /// <returns>True代表有,False代表没有</returns>
        public bool HasPushedContent( )
        {
            return pushTimesCount > 0L;
        }

        #endregion

        #region Private Member

        private List<AppSession> appSessions;               // 所有的客户端信息
        private SimpleHybirdLock simpleHybird;              // 列表的锁
        private long pushTimesCount = 0L;                   // 推送的次数总和

        #endregion
        
        #region IDisposable Support

        private bool disposedValue = false; // 要检测冗余调用

        /// <summary>
        /// 释放当前的程序所占用的资源
        /// </summary>
        /// <param name="disposing">是否释放资源</param>
        protected virtual void Dispose( bool disposing )
        {
            if (!disposedValue)
            {
                if (disposing)
                {
                    // TODO: 释放托管状态(托管对象)。
                }

                // TODO: 释放未托管的资源(未托管的对象)并在以下内容中替代终结器。
                // TODO: 将大型字段设置为 null。


                simpleHybird.Enter( );
                appSessions.ForEach( m => m.WorkSocket?.Close( ) );
                appSessions.Clear( );
                simpleHybird.Leave( );

                simpleHybird.Dispose( );

                disposedValue = true;
            }
        }

        // TODO: 仅当以上 Dispose(bool disposing) 拥有用于释放未托管资源的代码时才替代终结器。
        // ~PushGroupClient() {
        //   // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
        //   Dispose(false);
        // }


        // 添加此代码以正确实现可处置模式。

        /// <summary>
        /// 释放当前的对象所占用的资源
        /// </summary>
        public void Dispose()
        {
            // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
            Dispose( true );
            // TODO: 如果在以上内容中替代了终结器,则取消注释以下行。
            // GC.SuppressFinalize(this);
        }

        #endregion

        #region Object Override

        /// <summary>
        /// 获取本对象的字符串表示形式
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            return "PushGroupClient";
        }
        
        #endregion
    }
}