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