关于自定义二进制协议,我有几个问题。
我们的服务器连接到由用户控制的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)
。
二进制协议如何处理?
取决于协议。没有一个好的答案。