示例#1
0
        /// <summary>
        /// 네트워크 작업을 시작합니다.
        /// </summary>
        /// <param name="generator">Session 객체를 생성하는 Delegator를 설정합니다. SessionManager에서는 내부적으로 Session Pool을 관리하는데, Pool에 객체가 부족할 때 이 Delegator가 호출됩니다. 그러므로 이 Delegator에서는 ObjectPool 대신 new를 사용해 인스턴스를 생성하는 것이 좋습니다.</param>
        /// <param name="initPoolCount">처음 생성할 Session의 개수를 지정합니다.</param>
        /// <param name="maxPoolCount">생성할 수 있는 Session의 최대개수를 지정합니다. 0이 입력되면 최대개수를 무시합니다.</param>
        /// <returns>현재 NetworkChannel 객체를 반환합니다.</returns>
        public NetworkChannel StartNetwork(SessionGenerateDelegator generator, Int32 initPoolCount, Int32 maxPoolCount)
        {
            if (generator == null)
            {
                throw new AegisException(AegisResult.InvalidArgument, $"Argument '{nameof(generator)}' could not be null.");
            }

            _sessionGenerator = generator;
            MaxSessionCount   = maxPoolCount;


            lock (this)
            {
                while (initPoolCount <= maxPoolCount && initPoolCount-- > 0)
                {
                    Session session = _sessionGenerator();
                    session.Activated   += OnSessionActivated;
                    session.Inactivated += OnSessionInactivated;

                    InactiveSessions.Add(session);
                }
            }


            return(this);
        }
示例#2
0
        /// <summary>
        /// 지정된 NetworkChannel만을 생성하고 네트워킹을 시작합니다.
        /// sessionGenerator가 지정되기 때문에 config file에 정의된 sessionClass, receiveBufferSize는 무시됩니다.
        /// </summary>
        /// <param name="networkChannelName">시작할 NetworkChannel 이름</param>
        /// <param name="sessionGenerator">Session 객체를 생성하는 Delegator</param>
        /// <returns>해당 NetworkChannel 객체</returns>
        public static NetworkChannel StartNetwork(String networkChannelName, SessionGenerateDelegator sessionGenerator)
        {
            ConfigNetworkChannel config = _listNetworkConfig.Find(v => v.NetworkChannelName == networkChannelName);

            if (config == null)
            {
                throw new AegisException(AegisResult.InvalidArgument, "Invalid NetworkChannel name({0}).", networkChannelName);
            }


            NetworkChannel channel = NetworkChannel.CreateChannel(config.NetworkChannelName);

            if (config.ListenIpAddress.Length == 0 || config.ListenPortNo == 0)
            {
                channel.StartNetwork(sessionGenerator, config.InitSessionPoolCount, config.MaxSessionPoolCount);
            }
            else
            {
                channel.StartNetwork(sessionGenerator, config.InitSessionPoolCount, config.MaxSessionPoolCount)
                .OpenListener(config.ListenIpAddress, config.ListenPortNo);
            }

            return(channel);
        }
示例#3
0
        /// <summary>
        /// 지정된 NetworkChannel만을 생성하고 네트워킹을 시작합니다.
        /// sessionGenerator가 지정되기 때문에 config file에 정의된 sessionClass, receiveBufferSize는 무시됩니다.
        /// </summary>
        /// <param name="networkChannelName">시작할 NetworkChannel 이름</param>
        /// <param name="sessionGenerator">Session 객체를 생성하는 Delegator</param>
        /// <returns>해당 NetworkChannel 객체</returns>
        public static NetworkChannel StartNetwork(String networkChannelName, SessionGenerateDelegator sessionGenerator)
        {
            ConfigNetworkChannel config = _listNetworkConfig.Find(v => v.NetworkChannelName == networkChannelName);
            if (config == null)
                throw new AegisException(AegisResult.InvalidArgument, "Invalid NetworkChannel name({0}).", networkChannelName);


            NetworkChannel channel = NetworkChannel.CreateChannel(config.NetworkChannelName);
            if (config.ListenIpAddress.Length == 0 || config.ListenPortNo == 0)
            {
                channel.StartNetwork(sessionGenerator, config.InitSessionPoolCount, config.MaxSessionPoolCount);
            }
            else
            {
                channel.StartNetwork(sessionGenerator, config.InitSessionPoolCount, config.MaxSessionPoolCount)
                       .OpenListener(config.ListenIpAddress, config.ListenPortNo);
            }

            return channel;
        }
示例#4
0
        /// <summary>
        /// Acceptor를 사용하는 네트워크 작업을 시작합니다.
        /// </summary>
        /// <param name="generator">Session 객체를 생성하는 Delegator를 설정합니다. SessionManager에서는 내부적으로 Session Pool을 관리하는데, Pool에 객체가 부족할 때 이 Delegator가 호출됩니다. 그러므로 이 Delegator에서는 ObjectPool 대신 new를 사용해 인스턴스를 생성하는 것이 좋습니다.</param>
        /// <param name="initPoolSize">최초에 생성할 Session의 개수를 지정합니다.</param>
        /// <param name="maxPoolSize">Session 객체의 최대개수를 지정합니다. 0이 입력되면 Session 생성시 최대개수를 무시합니다.</param>
        /// <param name="ipAddress">접속요청 받을 Ip Address</param>
        /// <param name="portNo">접속요청 받을 PortNo</param>
        public void StartNetwork(SessionGenerateDelegator generator, Int32 initPoolSize, Int32 maxPoolSize, String ipAddress, Int32 portNo)
        {
            SessionManager.SessionGenerator = generator;
            SessionManager.MaxSessionPoolSize = maxPoolSize;
            SessionManager.CreatePool(initPoolSize);

            Acceptor.Listen(ipAddress, portNo);
        }
示例#5
0
 /// <summary>
 /// 네트워크 작업을 시작합니다.
 /// </summary>
 /// <param name="generator">Session 객체를 생성하는 Delegator를 설정합니다. SessionManager에서는 내부적으로 Session Pool을 관리하는데, Pool에 객체가 부족할 때 이 Delegator가 호출됩니다. 그러므로 이 Delegator에서는 ObjectPool 대신 new를 사용해 인스턴스를 생성하는 것이 좋습니다.</param>
 /// <param name="initPoolSize">최초에 생성할 Session의 개수를 지정합니다.</param>
 /// <param name="maxPoolSize">Session 객체의 최대개수를 지정합니다. 0이 입력되면 Session 생성시 최대개수를 무시합니다.</param>
 public void StartNetwork(SessionGenerateDelegator generator, Int32 initPoolSize, Int32 maxPoolSize)
 {
     SessionManager.SessionGenerator = generator;
     SessionManager.MaxSessionPoolSize = maxPoolSize;
     SessionManager.CreatePool(initPoolSize);
 }
示例#6
0
        /// <summary>
        /// 네트워크 작업을 시작합니다.
        /// </summary>
        /// <param name="generator">Session 객체를 생성하는 Delegator를 설정합니다. SessionManager에서는 내부적으로 Session Pool을 관리하는데, Pool에 객체가 부족할 때 이 Delegator가 호출됩니다. 그러므로 이 Delegator에서는 ObjectPool 대신 new를 사용해 인스턴스를 생성하는 것이 좋습니다.</param>
        /// <param name="initPoolCount">처음 생성할 Session의 개수를 지정합니다.</param>
        /// <param name="maxPoolCount">생성할 수 있는 Session의 최대개수를 지정합니다. 0이 입력되면 최대개수를 무시합니다.</param>
        /// <returns>현재 NetworkChannel 객체를 반환합니다.</returns>
        public NetworkChannel StartNetwork(SessionGenerateDelegator generator, Int32 initPoolCount, Int32 maxPoolCount)
        {
            if (generator == null)
                throw new AegisException(AegisResult.InvalidArgument, $"Argument '{nameof(generator)}' could not be null.");

            _sessionGenerator = generator;
            MaxSessionCount = maxPoolCount;


            lock (this)
            {
                while (initPoolCount <= maxPoolCount && initPoolCount-- > 0)
                {
                    Session session = _sessionGenerator();
                    session.Activated += OnSessionActivated;
                    session.Inactivated += OnSessionInactivated;

                    InactiveSessions.Add(session);
                }
            }


            return this;
        }