关于自定义二进制协议,我有几个问题。
我们的服务器连接到由用户控制的CCT(自定义命令终端),并且可以将二进制命令发送到此中央单元。 CCT与服务器之间的通信是某个端口上的标准以太网套接字。
双向的所有命令和消息将使用相同的帧格式:
服务器收到带有有效校验和或第一个连接的消息时,它将向后发送一个确认字节。
为了进行通信,我使用带有DataInputStream和DataOutputStream的标准Java套接字。
我如何正确地从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(命令的开始)吗?
二进制协议如何处理?有什么最佳实践入门吗?也许是基于我要达到的目标的示例?
答案 0 :(得分:1)
如何正确地从DataInputStream中读取字节
请勿使用DataInputStream
。只需使用普通的InputStream
。
readbyte(byteArr, offsett, length)
返回读取的字节数。我为什么要使用此值?我应该将byteArr设置为多大?
由于Length
仅是一个字节,因此命令最多可以为256个字节(255 + 1字节ChkSm
),因此请使用byte[256]
。
然后,read(responseBytes)
返回的值告诉您实际接收了多少字节,因此您知道是否获得了所有字节(与Length
比较)。
当我从输入流中接收数据并使用
readByte()
您可能不会使用read()
来读取单个字节,而只会读取read(responseBytes)
。
二进制协议如何处理?
取决于协议。没有一个好的答案。