java - 从输入流解析自定义二进制协议(protocol)

标签 java binary protocols

我有几个关于自定义二进制协议(protocol)的问题。

我们的服务器连接到由用户控制的 CCT(自定义命令终端),并且可以向该中央单元发送二进制命令。 CCT与服务器之间的通信是某个端口上的标准以太网套接字。

双向的所有命令和消息都将使用相同的帧格式:

  • STX:0x02 - 指示命令开始的字节
  • 长度:消息的长度,包括 STX 和长度字节,但不包括校验和字节
  • 命令:命令类型
  • 参数 1-n:给定命令编号的数据字节
  • ChkSm:校验和字节

当服务器收到带有有效校验和的消息或第一次连接时,它将发送回一个确认字节。

对于通信,我使用带有 DataInputStream 和 DataOutputStream 的标准 Java 套接字。

  1. 如何正确读取 DataInputStream 中的字节并将它们转换回其原始值(整数、 boolean 值……)。我知道有 readByte()readShort()readbyte(byteArr, offsett, length) 方法,但为什么我更喜欢其中一个超过另一个。

  2. readbyte(byteArr, offsett, length) 返回读取的字节数。为什么要使用这个值是我的场景。 byteArr 的大小应该作为我的参数?

     byte[] responseBytes = new byte[5];
     int bytesRead = 0;
     try {
         bytesRead = mInputStream.read(responseBytes, 0, 4);
     } catch (IOException e1) {
         e1.printStackTrace();
     }
    
  3. 当我从输入流接收数据并使用 readByte() 时,这会是 STX(命令的开始)吗?

  4. 如何处理二进制协议(protocol)?是否有任何开始此方面的最佳实践?也许是一个基于我想要实现的目标的示例?

最佳答案

How I can correctly read in the bytes from the DataInputStream

不要使用DataInputStream。只需使用普通的InputStream即可。

readbyte(byteArr, offsett, length) returns the number of bytes read. Why would I use this value is my scenario. What size should the byteArr be as my parameter?

由于Length只是一个字节,一个命令最多可以有256字节长(255 + 1字节ChkSm),所以使用一个字节[256].

read(responseBytes) 返回的值会告诉您实际收到了多少字节,因此您知道是否获得了所有字节(与 Length 比较)。

When I receive data from the inputstream and I use readByte()

您可能不会使用 read() 来读取单个字节,而只会使用 read(responseBytes)

How are binary protocols handled?

取决于协议(protocol)。没有一个好的答案。

关于java - 从输入流解析自定义二进制协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51860329/

相关文章:

java - 在Java中将Base64转换为二进制字符串

network-programming - 网络序列化协议(protocol)设计的建模软件

java - 为什么 Java 的 URL 类不能识别某些协议(protocol)?

java - 使用 GridBagLayout 将按钮定位在菜单栏下方

c - 如何将小数打印成 32 位二进制,将其分隔 8 位

java - 字节组合生成器和定序器

swift - 如何编写 Realm Results 对象扩展

java - Jenkins 命令显示目录中的所有文件?

java - Spring boot thymeleaf 显示productName

java - 是否有可以创建丰富的 Word 文档的 Java API?