我有几个关于自定义二进制协议(protocol)的问题。
我们的服务器连接到由用户控制的 CCT(自定义命令终端),并且可以向该中央单元发送二进制命令。 CCT与服务器之间的通信是某个端口上的标准以太网套接字。
双向的所有命令和消息都将使用相同的帧格式:
- STX:0x02 - 指示命令开始的字节
- 长度:消息的长度,包括 STX 和长度字节,但不包括校验和字节
- 命令:命令类型
- 参数 1-n:给定命令编号的数据字节
- ChkSm:校验和字节
当服务器收到带有有效校验和的消息或第一次连接时,它将发送回一个确认字节。
对于通信,我使用带有 DataInputStream 和 DataOutputStream 的标准 Java 套接字。
如何正确读取 DataInputStream 中的字节并将它们转换回其原始值(整数、 boolean 值……)。我知道有
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(命令的开始)吗?如何处理二进制协议(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/