示例#1
0
        /*public static async Task RunUdpServerAsync(int port, IChannelHandler packetHandler, ILoop loop)
         * {
         *  var group = new MultithreadEventLoopGroup();
         *
         *  try
         *  {
         *      var bootstrap = new Bootstrap();
         *      bootstrap
         *          .Group(group)
         *          .Channel<SocketDatagramChannel>()
         *          .Handler(new ActionChannelInitializer<IChannel>(channel =>
         *          {
         *              IChannelPipeline pipeline = channel.Pipeline;
         *              pipeline.AddLast("handler", packetHandler);
         *          }));
         *
         *      var bootstrapChannel = await bootstrap.BindAsync(port).ConfigureAwait(false);
         *
         *      Log.Info($"Server is listening to port {port}!");
         *      loop.Loop();
         *
         *      await bootstrapChannel.CloseAsync().ConfigureAwait(false);
         *  }
         *  catch (Exception ex)
         *  {
         *      Log.Error("", ex);
         *  }
         *  finally
         *  {
         *      Task.WaitAll(group.ShutdownGracefullyAsync());
         *  }
         * }*/

        public static async Task RunTcpServerAsync(int port, ICustomTcpChannelHandler channelHandler, ILoop loop)
        {
            var bossGroup   = new MultithreadEventLoopGroup();
            var workerGroup = new MultithreadEventLoopGroup();

            try
            {
                var bootstrap = new ServerBootstrap();
                bootstrap
                .Option(ChannelOption.SoBacklog, 16)
                .Option(ChannelOption.TcpNodelay, true)
                .Option(ChannelOption.SoKeepalive, true)
                .Group(bossGroup, workerGroup)
                .Channel <TcpServerSocketChannel>()
                .ChildHandler(new ActionChannelInitializer <ISocketChannel>(channel =>
                {
                    var pipeline = channel.Pipeline;

                    pipeline.AddLast("framing-enc", new FunatEncoder());
                    //pipeline.AddLast("framing-dec", new FunatDecoder());

                    pipeline.AddLast("session", channelHandler.GetNewWithChannelHandler(channel));
                }));

                var bootstrapChannel = await bootstrap.BindAsync(port).ConfigureAwait(false);

                Log.Info($"Server is listening to port {port}!");
                loop.Loop();

                await bootstrapChannel.CloseAsync().ConfigureAwait(false);
            }
            catch (Exception ex)
            {
                Log.Error("", ex);
            }
            finally
            {
                Task.WaitAll(workerGroup.ShutdownGracefullyAsync(), bossGroup.ShutdownGracefullyAsync());
            }
        }
示例#2
0
 public IStatefullLoop <T> Loop(Action <CancellationToken, T> action)
 {
     _loop.Loop(c => action(c, _state));
     return(this);
 }
示例#3
0
 public ActiveObject <T> Loop(Action <CancellationToken> action)
 {
     _loop.Loop(action);
     return(this);
 }