使用java解码二进制消息

我需要解码以高速率(> 1000 msgs / sec)发送的二进制消息,并使用JAVA将它们存储在DB(未决定哪一个)中.将有多个TCP连接进入此服务器,每个连接都有自己的二进制数据流,需要进行处理.

消息不会被任何“标志”分隔开.
消息的开头有一个4字节长的字段.它后面是一个固定的标题.
消息的有效载荷将依次是多个消息,每个消息具有固定的头部,然后是位掩码(32位),其确定存在哪些其他字段.每个位掩码字段是32位,位32-30(MSB-32 / Big endian)指定每个可选字段的长度.所有其他位(29-1),如果“ON”则表示该字段存在于消息中.

例如,如果位32-30是100,并且位1是“1”,则字段XXX跟随位掩码字段并且它是4字节长.如果位2为“0”,则消息中不存在字段YYY,依此类推.
存在多个位掩码字段(可选)但受最大数量限制.
我是java(c / C背景)的新手,所以问题可能……

1)我正在考虑以常规方式设计应用程序“主”线程接收连接并创建“工作线程A”来处理该套接字上的消息.我正在考虑让配置文件驱动“workerThread A”是否创建了一个用于处理每条消息的threadPool,或者是自己做的.我将实现前者并检查性能,看看是否需要改进.
我的问题是,netty还是Apache Mina的好选择?由于它是POC的努力,我需要快速启动它.
2)我想过使用nio – SocketChannel和ByteBuffer.但似乎我无法从套接字读取指定数量的字节?我认为“readInt()”更容易获得长度然后从套接字读取“长度”字节数以获得完整的一条消息然后解析它. DataInputStream是否更好用?使用oio vs nio会对性能产生什么影响?
3)我应该查看任何框架来解码消息吗?我稍微查看了Google协议缓冲区,但它似乎不支持解码位掩码字段.

解决方法:

我会为每个连接创建一个工作线程.

我会使用DataInputStream,除非你确定这不够快.性能影响很小,但不太可能达到1000 msg / sec.

我会在使用JDK到达时解码消息.我没有找到第三方库来使这种情况更简单.

上一篇:PHP数组编码和解码:需要一个函数来编码和解码带有分隔符或数组本身的字符串或数组


下一篇:如何在Scala或Java中解码Base64字符串?