java - 为 Java 中现有的二进制协议(protocol)生成解析器

标签 java network-programming netty protocol-buffers

我必须实现现有二进制协议(protocol)的高性能 Java 客户端。我会使用 Netty。然而,由于协议(protocol)很复杂(许多消息类型具有许多字段),我想将 netty 代码与解析代码分开,并从以更高抽象描述该协议(protocol)的文档中生成该协议(protocol)的解析器。与在 Google 的 Protocol Buffers 中所做的类似。不幸的是,我似乎无法使用 protobuf,因为我的协议(protocol)采用不同的二进制有线格式。有什么建议么?

最佳答案

我自己还没有尝试过,但我想您可能正在寻找 the java binary block parser

这是官方自述文件中的一个示例,展示了如何使用高级 DSL 来解析 TCP header 的结构:

final JBBPParser tcpParser = JBBPParser.prepare(
          "skip:34; // skip bytes till the frame\n"
          + "ushort SourcePort;"
          + "ushort DestinationPort;"
          + "int SequenceNumber;"
          + "int AcknowledgementNumber;"

          + "bit:1 NONCE;"
          + "bit:3 RESERVED;"
          + "bit:4 HLEN;"

          + "bit:1 FIN;"
          + "bit:1 SYN;"
          + "bit:1 RST;"
          + "bit:1 PSH;"
          + "bit:1 ACK;"
          + "bit:1 URG;"
          + "bit:1 ECNECHO;"
          + "bit:1 CWR;"

          + "ushort WindowSize;"
          + "ushort TCPCheckSum;"
          + "ushort UrgentPointer;"
          + "byte [$$-34-HLEN*4] Option;"
          + "byte [_] Data;"
  );

final JBBPFieldStruct result = pngParser.parse(tcpFrameStream);

关于java - 为 Java 中现有的二进制协议(protocol)生成解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37971163/

相关文章:

java - Play & Ebean - 获得第一条记录

java - 如何使用 JSch 连接到 SSH 后收到欢迎消息

linux - 在没有服务器调用 'connect' 的情况下,套接字上的 'accept' 调用能否成功返回?

java - 在 kryonet 中,如何在不停止程序的情况下断开与服务器的连接?

java - 类似于 Netty 的 C++ 网络库

java - 从同一端口提供网络套接字和网页

java - 使用Seekbar调整EditText

java - 如何缩短此 KeyListener 代码

python - 根据 WiFi 确定笔记本电脑的位置

java - 为什么 Direct ByteBuffer 在 HornetQ 服务器上不断增加导致 OOM?