2

次のメッセージを処理しようとしています。

CMD (string) FLAG (byte) CMD_OPT (string)

文字列は、長さを含む先頭の 1 バイトで表され、その後に最大 255 バイトが続きます。したがって、特定の例については:

 EQ_REGISTER 0 flaux

19 バイトあります。私のパイプラインでは、LengthFieldBasedFrameDecoder から開始し、最初の文字列の値を確認したら、最初のデコーダーを削除しようとします。問題は、デコーダーが FLAG バイトで再度呼び出され、ロジックがオフになっていることです。

ここに私のパイプラインがあります:

    ChannelPipeline pipeline = Channels.pipeline();

    pipeline.addLast("commandDecoder", new CerbStringDecoder());
    pipeline.addLast("commandHandler", new EventQueueCmdServerHandler());

CerbStringDecoder は次のとおりです。

   class CerbStringDecoder extends LengthFieldBasedFrameDecoder {
    public CerbStringDecoder() {
        super(255, 0, 1, 0, 1);
    }


    protected Object decode(
            ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws Exception {
        ChannelBuffer buf = (ChannelBuffer) super.decode(ctx, channel, buffer);

        if (buf == null)
            return null;

        return buf.toString(Charset.forName("UTF-8"));
    }
}


 public class EventQueueCmdServerHandler extends SimpleChannelHandler {

    @Override
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {

        String command = (String) e.getMessage();

        if (EQ_REGISTER.equals(command)) {
            System.out.println("COMMAND: [" + command + "]");
            ctx.getPipeline().addLast("handler", new EventQueueRegisterHandler());
            ctx.getPipeline().remove("commandDecoder");

       ....

EventQueueRegisterHandler は、FLAG や CMD_OPT などを取得することを想定しています。

私が間違っていること、またはこれがNettyのバグ/制限であるかどうかについて何かアドバイスはありますか?

ありがとう

4

1 に答える 1

1

「replace(..)」メソッドを使用して、バッファリングされたすべてのバイトを削除するときに確実にフラッシュする必要があります。それについては、javadoc を参照してください [1]。

[1] http://static.netty.io/3.5/api/org/jboss/netty/handler/codec/frame/FrameDecoder.html#replace(java.lang.String,%20org.jboss.netty.channel. ChannelHandler )

于 2012-09-13T06:05:56.327 に答える