ここで javadoc を見てみましょう: http://netty.io/4.0/api/
アップストリームとダウンストリームについて話している場合、Netty4 ではこれらはインバウンドとアウトバウンドと見なされます。ドキュメントは時々両方を参照します。
特に例を見てください: (少し変更しました)
ChannelPipeline p = ...;
p.addLast("1", new InboundHandlerA());
p.addLast("2", new InboundHandlerB());
p.addLast("3", new OutboundHandlerA());
p.addLast("4", new OutboundHandlerB());
p.addLast("5", new HandlerX());
この例では、Inbound* という名前の ChannelHandlers が ChannelInboundHandler を実装しています。Outbound という名前の ChannelHandler は、ChannelOutboundHandler を実装します。
HandlerX は、受信メッセージ イベントを処理し、チャネルへの書き込みによって送信メッセージ イベントを生成するため、ChannelInboundHandler を実装します。
Inbound イベント (チャネルがバインドされているソケットに送信されたデータを Netty が読み取るなど) がある場合、InboundHandler* が上から下に順に実行されます。
InboundHandlerA -> InboundHandlerB -> HandlerX
Outbound イベント (チャネルへの HandlerX の書き込みなど) がある場合、OutboundHandler* は下から上に順に実行されます。
OutboundHandlerB -> OutboundHandlerA.
拡張機能として、インバウンドとアウトバウンドの両方を実装し、パイプラインの実行で 2 回呼び出される ChannelHandler を持つことができます。
したがって、あなたの場合、次のようなものが必要です
ChannelPipeline p = ...;
p.addLast("DECODER", new MyMessageDecoder());
p.addLast("ENCODER", new MyMessageEncoder());
p.addLast("HANDLER", new MyHandler());
ここで、MyMessageDecoder と MyHandler は ChannelInboundHandler を実装し、MyMessageEncoder は ChannelOutboundHandler を実装します。