私はDotNettyをかなり新しくしており、次の問題を発見しました。DotNetty - ハンドルの前にパイプラインでデコーダを使用すると、メッセージが2回処理される
私はNettyの例とドキュメントを読んできました。
POCO(POJO; s)を扱うときに私が示唆したことは、decodeメソッドを実装するDecorderクラスを作成し、IByteBufferを適切なPOCOに変換することです。 ServerHandler(InboundHandler)は、そのメッセージとしてPOCOと共に動作します。 これは本当にすっきりしていて、すっきりしています。私がしなければならないことは、デコーダをパイプラインに追加して魔法が発生することだけです。
まあまあです。 私が今直面している問題は、これを行う分、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();