public NetClient(ClientOption clientOption, ILoggerFactory loggerFactory = null) { _clientOption = clientOption; //_clientOptions.PacketFilter = _clientOptions.PacketFilter ?? new XorPacketFilter(); _loggerFactory = loggerFactory ?? DefaultLoggerFactory.Create(builder => { builder.AddConsoleLogger(); }); _logger = _loggerFactory.CreateLogger(nameof(NetClient)); _receivedPacketQueue = new ConcurrentQueue <NetPacket>(); _packetReader = new NetDataReader(); _statistic = new NetStatistic(); _tcpChannel = new TcpChannel( _clientOption, _loggerFactory.CreateLogger(nameof(TcpChannel)), _statistic); if (_clientOption.IsServiceUdp == true) { _udpChannel = new UdpChannel( _clientOption, _loggerFactory.CreateLogger(nameof(UdpChannel)), _statistic, 0); } _request = new SessionRequest(this, _statistic); _rpcHandlers = new List <IRpcInvokable>(); }
public NetServer( ServerOption serverOption, NetStatistic statistics = null, ILoggerFactory loggerFactory = null, ISessionFactory sessionFactory = null) { Name = serverOption.Name; _serverOption = serverOption; //_serverOptions.PacketFilter = _serverOptions.PacketFilter ?? new XorPacketFilter(); _loggerFactory = loggerFactory ?? DefaultLoggerFactory.Create(builder => { builder.AddConsoleLogger(); }); _logger = _loggerFactory.CreateLogger("Server"); _statistic = statistics ?? new NetStatistic(); _sessionFactory = sessionFactory ?? new DefaultSessionFactory(_serverOption, _loggerFactory, _statistic); _sessionManager = new SessionManager(_serverOption.MaxSession); if (_serverOption.IsServiceUdp) { _p2pManager = new P2pManager(); OnSessionClosed += _p2pManager.OnSessionClose; } _rpcHandlers = new List <IRpcInvokable>(); }
public virtual NetStatistic GetStatisticInfo() { NetStatistic s = new NetStatistic(); NetStatisticGroup gs = s.AddGroup("会话信息", false); gs.AddColumn("接收字节数", "BYTE"); gs.AddColumn("发送字节数", "BYTE"); gs.AddColumn("错误字节数", "BYTE"); gs.AddColumn("活动时间", "TIME"); gs.AddColumn("开始时间", "TIME"); List <INetSession> sl = null; lock (SyncLocker) { sl = SessionList.Values.ToList(); } foreach (INetSession session in sl) { SocketSession ss = session as SocketSession; if (ss != null) { string sn = string.Format("{0},{1}", session.SessionID, ss.EndPoint.ToString()); NetStatisticItem si = gs.AddItem(sn, ss.ReceivedBytes); si.Value2 = ss.SendedBytes; si.Value3 = ss.ErrorBytes; si.Value4 = ss.ActiveTime.Ticks; si.Value5 = ss.StartTime.Ticks; } } return(s); }
public void Run() { var serverOption = new ServerOption() { Name = "SampleGameServer", TcpServerPort = 12000, IsServiceUdp = true, UdpServerPort = 12001, MaxSession = 100, }; var loggerFactory = DefaultLoggerFactory.Create( builder => { builder.SetMinimumLevel(LogLevel.Information); builder.AddConsoleLogger(); } ); var statistics = new NetStatistic(); var sessionFactory = new DefaultSessionFactory( serverOption, loggerFactory, statistics, (createInfo) => { return(new UserSession(createInfo)); }); _server = new NetServer( serverOption, statistics, loggerFactory, sessionFactory); _server.AddRpcService(new LoginRpcServiceSession()); _server.StartAsync().Wait(); _p2pGroup = _server.P2pManager.CreateP2pGroup(); while (true) { var key = Console.ReadKey(); if (key.Key == ConsoleKey.Escape) { Console.WriteLine("quit"); break; } } _server.StopAsync().Wait(); }
public DefaultSessionFactory( ServerOption serverOption, ILoggerFactory loggerFactory, NetStatistic statistic, Func <SessionCreateInfo, ServerSession> createSessionFunc = null) { createSessionFunc = createSessionFunc ?? CreateSession; _sessionQueue = new ConcurrentQueue <ISession>(); _maxSession = serverOption.MaxSession; var createInfo = new SessionCreateInfo(); for (int i = 0; i < _maxSession; ++i) { TcpChannel tcpChannel = new TcpChannel( serverOption, loggerFactory.CreateLogger(nameof(TcpChannel)), statistic); UdpChannel udpChannel = null; if (serverOption.IsServiceUdp) { udpChannel = new UdpChannel( serverOption, loggerFactory.CreateLogger(nameof(UdpChannel)), statistic, 0); } createInfo.SessionId = (ushort)(i + 1); createInfo.TcpChannel = tcpChannel; createInfo.UdpChannel = udpChannel; createInfo.Statistic = statistic; ServerSession session = createSessionFunc(createInfo); _sessionQueue.Enqueue(session); } }
public async Task Start() { // 서버 옵션을 정의 var serverOption = new ServerOption() { Name = "StarterServer", TcpServerPort = 12000, IsServiceUdp = true, UdpServerPort = 12001, MaxSession = 1000, IsCheckAlive = true, CheckAliveInterval = 50000, CheckAliveTimeout = 60000, }; // 로거 팩토리를 생성 var loggerFactory = DefaultLoggerFactory.Create( builder => { builder.SetMinimumLevel(LogLevel.Information); builder.AddConsoleLogger(); } ); var statistics = new NetStatistic(); // UserSession 을 사용하기 위해서 팩토리를 만듬 var sessionFactory = new DefaultSessionFactory( serverOption, loggerFactory, statistics, (createInfo) => { return(new UserSession(createInfo)); }); // 서버를 생성 _server = new NetServer( serverOption, statistics, loggerFactory, sessionFactory); // 자동으로 생성된 Rpc 서비스를 등록함 _server.AddRpcService(new LoginRpcServiceSession()); _server.AddRpcService(new ShopRpcServiceSession()); // P2p 그룹을 만듬 (현재는 1개만 필요하니 한개만 만듬. 여러개 생성가능) _p2pGroup = _server.P2pManager.CreateP2pGroup(); // 서버를 시작함 await _server.StartAsync(); // 메인스레드에 키 입력을 받을 수 있게 함 while (true) { var key = Console.ReadKey(); if (key.Key == ConsoleKey.Escape) { Console.WriteLine("quit"); break; } } // 서버 정지 await _server.StopAsync(); }
public UnreliableChannel(IChannelOption channelOption, ILogger logger, NetStatistic statistic, UdpChannel channel) : base(channelOption, logger, statistic) { _udpChannel = channel; }