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

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

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


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


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

为了进行通信,我将使用标准Java套接字以及DataInputStream和DataOutputStream。


我如何正确地从DataInputStream中读取字节并将其转换回其原始值(整数,布尔值,...)。我知道有readByte()readShort()readbyte(byteArr, offsett, length)方法,但是为什么我会优先选择一个。
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();
 }

当我从输入流接收数据并使用readByte()时,这将是STX(命令的开始)吗?
二进制协议如何处理?是否有关于此方面的最佳实践?也许是一个基于我想要达到的目标的例子?

最佳答案

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


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


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


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

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


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


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


  二进制协议如何处理?


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

10-07 13:19