4

netty ネットワーク ライブラリを使用して、ゲーム クライアント用のログイン サーバーを構築しました。
このゲーム クライアントは、1 つのバッファで複数のパケットを送信することを好みますが、これが問題を引き起こします。その問題は、netty デコード クラスでは、1 つのメッセージしか返せないという事実です。

次に、複数のパケットを複数のメッセージに読み込んで、それらを 1 回のデコード メソッド呼び出しで返すことは不可能です。

私の質問は、1 回の DecoderClass.decode() メソッド呼び出しで複数のパケットを受信するにはどうすればよいですか? オブジェクトを 1 つしか返せないので、当惑しています。

私の予備のデコードクラスは次のとおりです。

protected Object decode(ChannelHandlerContext ctx, Channel c, ChannelBuffer buf,           
    VoidEnum state) throws Exception {
    short length = -1;
    short opcode = -1;
    short security = -1;

    while(buf.readableBytes() != 0 ){
        length = buf.readShort();
        opcode = buf.readShort();
        security = buf.readShort();
    }

    System.out.println("---------------------------------------");
    System.out.println("receivedLength: " + length);
    System.out.println("receivedOPCode: " + opcode);
    System.out.println("receivedSecurity: " + security);
    System.out.println("---------------------------------------");

    MessageCodec<?> codec = CodecLookupService.find(opcode);
    if (codec == null) {
        throw new IOException("Unknown op code: " + opcode + " (previous opcode: " + previousOpcode + ").");
    }


    previousOpcode = opcode;


    return codec.decode(buf);

私の完全な github リポジトリはこちらです: https://github.com/desmin88/LoginServer

誰かが私の問題を十分に理解できるように、十分な情報を提供したことを願っています

ありがとう、

ビリー

4

1 に答える 1

4

を使用しFrameDecoderて、受信したデータを複数の「フレーム」に分割し、デコーダーに渡すことができます。のAPIリファレンスにいくつかのサンプルコードFrameDecoderがあります。

もっとコメントするのではなく、次のようにします。

  1. 独自に実装するFrameDecoderか、既存のものの1つを使用します。独自のを実装するとしますMyGameFrameDecoder。あなたがあなた自身を書くならば、私はチェックすることを勧めますReplayingDecoder(それは悪いお尻です)。
  2. 既存のデコーダー()とともに、サーバー側に追加MyGameFrameDecoderします。ChannelPipelineDecoderClass

これは次のようになります。

/* ... stuff ... */
pipeline.addLast("framer", new MyGameFrameDecoder());
pipeline.addLast("decoder", new DecoderClass());
/* ... more stuff ... */

次に、着信データはを通過FrameDecoderし、ストリームを「フレーム」に分割します。このフレームは、データを操作可能なオブジェクトへの変換を処理できるデコーダーに送信されます。

于 2012-10-18T20:07:15.743 に答える