一个Netty缓冲区问题中包含多条消息 - java

我使用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

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

谢谢,

比利

参考方案

您将需要使用FrameDecoder将接收到的数据拆分为多个“帧”,以传递给解码器。 API参考中有一些针对FrameDecoder的example code。

与其发表评论,不如做这样的事情:

  • 实现您自己的FrameDecoder或使用现有的MyGameFrameDecoder。假设您实现了自己的ReplayingDecoder。如果您自己编写,我建议您检查 MyGameFrameDecoder (这很糟糕)。
  • 与现有的解码器(ChannelPipeline)一起,将DecoderClass添加到服务器端的FrameDecoder中。
  • 看起来像这样:

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

    然后,传入的数据将通过ojit_code并将流分成“帧”,然后将其发送到解码器,该解码器可以处理将数据转换为可操作的对象。

    Java-搜索字符串数组中的字符串 - java

    在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…

    Java Scanner读取文件的奇怪行为 - java

    因此,在使用Scanner类从文件读取内容时,我遇到了一个有趣的问题。基本上,我试图从目录中读取解析应用程序生成的多个输出文件,以计算一些准确性指标。基本上,我的代码只是遍历目录中的每个文件,并使用扫描仪将其打开以处理内容。无论出于何种原因,扫描程序都不会读取其中的一些文件(所有UTF-8编码)。即使文件不是空的,scanner.hasNextLine()在…

    Java:正则表达式模式匹配器是否有大小限制? - java

    我的模式类似于OR:“word1 | word2 | word3”我大约有800个字。可能有问题吗? 参考方案 您仅受记忆和理智的限制。 :)

    Java:线程池如何将线程映射到可运行对象 - java

    试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

    Java Globbing模式以匹配目录和文件 - java

    我正在使用递归函数遍历根目录下的文件。我只想提取*.txt文件,但不想排除目录。现在,我的代码如下所示:val stream = Files.newDirectoryStream(head, "*.txt") 但是这样做将不会匹配任何目录,并且返回的iterator()是False。我使用的是Mac,所以我不想包含的噪音文件是.DS_ST…