从输入流解析自定义二进制协议

时间:2018-08-15 14:08:15

标签: java binary protocols

关于自定义二进制协议,我有几个问题。

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

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

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

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

为了进行通信,我使用带有DataInputStream和DataOutputStream的标准Java套接字。

  1. 我如何正确地从DataInputStream中读取字节并将其转换回其原始值(整数,布尔值,...)。我知道有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. 二进制协议如何处理?有什么最佳实践入门吗?也许是基于我要达到的目标的示例?

1 个答案:

答案 0 :(得分:1)

  

如何正确地从DataInputStream中读取字节

请勿使用DataInputStream。只需使用普通的InputStream

  

readbyte(byteArr, offsett, length)返回读取的字节数。我为什么要使用此值?我应该将byteArr设置为多大?

由于Length仅是一个字节,因此命令最多可以为256个字节(255 + 1字节ChkSm),因此请使用byte[256]

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

  

当我从输入流中接收数据并使用readByte()

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

  

二进制协议如何处理?

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