一个netty缓冲区问题中包含多个消息

时间:2012-10-18 19:43:16

标签: java netty decode channel

我使用netty网络库为游戏客户端构建了一个登录服务器 这个游戏客户端喜欢在一个缓冲区中发送多个数据包,这就产生了问题;这个问题是在netty解码类中,它只能返回一个消息。

然后我不可能将多个数据包读入多个消息并在一个解码方法调用中返回它们。

我的问题是:如何在一个DecoderClass.decode()方法调用中最好地接收多个数据包?因为我只能归还一个物体,所以我很困惑。

我的初步解码课程如下:

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

我希望我提供了足够的信息,以便有人能够充分理解我的问题

谢谢,

比利

1 个答案:

答案 0 :(得分:4)

您希望使用FrameDecoder将收到的数据拆分为多个&#34;框架&#34;传递给你的解码器。 FrameDecoder的API参考中有一些example code

不是评论更多,你会做这样的事情:

  1. 实施您自己的FrameDecoder或使用现有的MyGameFrameDecoder。我们假设你实现了自己的MyGameFrameDecoder。如果你自己编写,我建议你查看ReplayingDecoder(它的坏人)。
  2. ChannelPipeline与您现有的解码器(DecoderClass)一起添加到服务器端的/* ... stuff ... */ pipeline.addLast("framer", new MyGameFrameDecoder()); pipeline.addLast("decoder", new DecoderClass()); /* ... more stuff ... */
  3. 看起来像这样:

    FrameDecoder

    然后,传入的数据将通过{{1}}并将流分解为&#34;帧&#34;然后将其发送到您的解码器,解码器可以处理将数据转换为您可以操作的对象。