2017-05-18 10 views
0

私はNettyが新しく、どのように動作しているのか理解しようとしています。Netty:MessageToMessageEncoderとByteBufへの変換

localhost上でテスト用の単純なSMTPサーバーを作成したいのですが、エンコーダの仕組みを理解している小さな問題があります。

まず、私が達成したいことはここにあります。

  1. クライアントは、25ポート上のサーバーに接続している - OK
  2. Serverは、このメッセージを送信します。220 localhost Test \r\n
  3. クライアントは2で送信されたメッセージを受信して​​、私の問題がポイントであるHELO whatever

に返信2

私は使用しようとしていますMessageToMessageEncoder

コード out.add("220 localhost Test \r\n");は何もしないされ、エラーが返されず、クライアントが HELOメッセージを送信 3を指すように進んでいません
@Override 
protected void encode(ChannelHandlerContext ctx, Object msg, List<Object> out) throws Exception { 
    //... 
    out.add("220 localhost test \r\n"); 
} 

。だから私の質問は、私はいつもByteBufにメッセージをエンコードする必要がありますされ

は、しかし、私が変更した場合、この

ByteBuf buff = ByteBufUtil.writeUtf8(ctx.alloc(), "220 localhost Test \r\n"); 
out.add(buff); 

にすべてが素晴らしい実行されていることと、クライアントはHELOメッセージ

を送信していますか? 公式の文書のために私はこれを求めています:http://netty.io/4.1/api/io/netty/handler/codec/MessageToMessageEncoder.html 私はこのようなものを見ますout.add(message.toString());

答えて

1

はい。最終的に、ペイロードはByteBufの形式でなければなりません。ただし、意図したとおり、引用した例では表示されませんが、MessageToMessageエンコーダは、メッセージをByteBufに変換する別のエンコーダによって下流のパイプラインで追跡されます。そのリンクから、このコードに見られるように、あなたのケースでは、http://netty.io/4.1/api/io/netty/handler/codec/string/StringEncoder.htmlは、トリックを行うだろう:

ChannelPipeline pipeline = ...; 

// Decoders 
pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(80)); 
pipeline.addLast("stringDecoder", new StringDecoder(CharsetUtil.UTF_8)); 

// Encoder 
pipeline.addLast("stringEncoder", new StringEncoder(CharsetUtil.UTF_8)); 
+0

をだから、最終的に送信されるメッセージのために、それはByteBufなければなりませんか? –