public override async Task Start(ServiceAddress serviceAddress)
        {
            _logger.Debug($"准备启动服务主机,监听地址:{serviceAddress}。");
            var bossGroup   = new MultithreadEventLoopGroup(1);
            var workerGroup = new MultithreadEventLoopGroup();//Default eventLoopCount is Environment.ProcessorCount * 2
            var bootstrap   = new ServerBootstrap();

            bootstrap
            .Group(bossGroup, workerGroup)
            .Channel <TcpServerSocketChannel>()
            .Option(ChannelOption.SoBacklog, 100)
            .ChildOption(ChannelOption.Allocator, PooledByteBufferAllocator.Default)
            .ChildHandler(new ActionChannelInitializer <ISocketChannel>(channel =>
            {
                var pipeline = channel.Pipeline;
                pipeline.AddLast(new LengthFieldPrepender(4));
                pipeline.AddLast(new LengthFieldBasedFrameDecoder(int.MaxValue, 0, 4, 0, 4));
                pipeline.AddLast(new MicroMessageHandler(_coderFactory.GetDecoder()));
                pipeline.AddLast(new ServerHandler(async(contenxt, message) =>
                {
                    var sender = new DotNettyServerSender(_coderFactory.GetEncoder(), contenxt);
                    await OnReceived(sender, message);
                }));
            }));
            var endPoint = serviceAddress.ToEndPoint();

            _channel = await bootstrap.BindAsync(endPoint);

            _logger.Info($"服务主机启动成功,监听地址:{serviceAddress}。");
        }
Exemple #2
0
 public DotNettyClientFactory(IMessageCoderFactory coderFactory, IMicroExecutor executor = null)
 {
     _coderFactory  = coderFactory;
     _microExecutor = executor;
     _logger        = LogManager.Logger <DotNettyClientFactory>();
     _bootstrap     = GetBootstrap();
     _bootstrap.Handler(new ActionChannelInitializer <ISocketChannel>(c =>
     {
         var pipeline = c.Pipeline;
         pipeline.AddLast(new LengthFieldPrepender(4));
         pipeline.AddLast(new LengthFieldBasedFrameDecoder(int.MaxValue, 0, 4, 0, 4));
         pipeline.AddLast(new MicroMessageHandler(_coderFactory.GetDecoder()));
         pipeline.AddLast(new ClientHandler(channel =>
         {
             var k = channel.GetAttribute(OrigEndPointKey).Get();
             _logger.Debug($"删除客户端:{k}");
             _clients.TryRemove(k, out _);
         }, async(context, msg) =>
         {
             var listener = context.Channel.GetAttribute(ListenerKey).Get();
             var sender   = context.Channel.GetAttribute(SenderKey).Get();
             await listener.OnReceived(sender, msg);
         }));
     }));
 }