/*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()); } }
public IStatefullLoop <T> Loop(Action <CancellationToken, T> action) { _loop.Loop(c => action(c, _state)); return(this); }
public ActiveObject <T> Loop(Action <CancellationToken> action) { _loop.Loop(action); return(this); }