2017-06-17 18 views
0

私はDotNettyをかなり新しくしており、次の問題を発見しました。DotNetty - ハンドルの前にパイプラインでデコーダを使用すると、メッセージが2回処理される

私はNettyの例とドキュメントを読んできました。

POCO(POJO; s)を扱うときに私が示唆したことは、decodeメソッドを実装するDecorderクラスを作成し、IByteBufferを適切なPOCOに変換することです。 ServerHandler(InboundHandler)は、そのメッセージとしてP​​OCOと共に動作します。 これは本当にすっきりしていて、すっきりしています。私がしなければならないことは、デコーダをパイプラインに追加して魔法が発生することだけです。

まあまあです。 私が今直面している問題は、これを行う分、ServerHandler(InboundHandler)によって同じPOCOが2回処理されることです。 このサンプルでは、​​デコーダがIbyteBufferを文字列に変換し、ServerHandlerがConsoleに出力するようにコードを単純化しました。以下

を参照してくださいコード: -

public class ToTextDecoder : ByteToMessageDecoder 
{ 
    protected override void Decode(IChannelHandlerContext context, IByteBuffer input, List<object> output) 
    { 
     var clientMessage = input.ToString(Encoding.UTF8); 
     output.Add(clientMessage); 
    } 
} 

public class RawConsoleWritingFromTextServerHandler : SimpleChannelInboundHandler<string> { 
    protected override void ChannelRead0(IChannelHandlerContext context, string message) { 
     Console.WriteLine("********************************************"); 
     Console.WriteLine("Server received message from client : " + message); 
     Console.WriteLine("********************************************"); 
    } 

    public override void ExceptionCaught(IChannelHandlerContext ctx, Exception e) { 
     //Console.WriteLine("{0}", e.ToString()); 
     ctx.CloseAsync(); 
    } 
} 

とブートストラップは

  var bootstrap = new ServerBootstrap(); 
      bootstrap 
       .Group(bossGroup, workerGroup) 
       .Channel<TcpServerSocketChannel>() 
       .Option(ChannelOption.SoBacklog, 100) 
       .Handler(new LoggingHandler("LSTN")) 
       .ChildHandler(new ActionChannelInitializer<ISocketChannel>(channel => 
       { 
        var pipeline = channel.Pipeline; 
        if (tlsCertificate != null) 
        { 
         pipeline.AddLast(TlsHandler.Server(tlsCertificate)); 
        } 
        pipeline.AddLast(new LoggingHandler("CONN")); 
        pipeline.AddLast(new ToTextDecoder()); 
        pipeline.AddLast(new RawConsoleWritingFromTextServerHandler()); 
       })); 

      IChannel bootstrapChannel = await bootstrap.BindAsync(ServerSettings.Port); 
      Console.WriteLine("---------------Server Ready-------------------------------"); 
      Console.ReadLine(); 

出力は The Output

答えて

0

docoderは、入力バッファをクリアする必要があります。 buffer.clearや、読み込まれたものとしてバッファを移動させるその他の読み込みを使用します。

関連する問題