Java 字节序列成帧
假设我从网络中获得一个字节序列,顺序如下: X=X X=X X=X X X=X X X=。。。等等 您可以立即注意到消息的模式是5个字节的序列:X= X当然可以是除“=”之外的任何数字 现在,传输周期性地发生。 在某个时刻,我的应用程序正在启动并获取字节序列 获取这些字节并将其帧化为5字节消息的最佳算法是什么? 有两个问题: 1.您如何找到第一条消息?我想我需要删除一些字节直到得到“=”对吗?Java 字节序列成帧,java,networking,byte,communication,Java,Networking,Byte,Communication,假设我从网络中获得一个字节序列,顺序如下: X=X X=X X=X X X=X X X=。。。等等 您可以立即注意到消息的模式是5个字节的序列:X= X当然可以是除“=”之外的任何数字 现在,传输周期性地发生。 在某个时刻,我的应用程序正在启动并获取字节序列 获取这些字节并将其帧化为5字节消息的最佳算法是什么? 有两个问题: 1.您如何找到第一条消息?我想我需要删除一些字节直到得到“=”对吗? 2.应用程序如何处理传输暂停和新启动 最简单的方法是使用最常见的阻塞读取,因为一次读取5个字节最简单
2.应用程序如何处理传输暂停和新启动 最简单的方法是使用最常见的阻塞读取,因为一次读取5个字节最简单 通常,您不会假设一开始就有垃圾数据,而只是读取所有内容。如果你有一个标题,我也会读
DataInputStream dis = new DataInputStream(socket stream);
byte[] bytes = new byte[5];
int sep;
do {
dis.readFully(bytes);
process(bytes);
} while((sep = dis.read()) == '=');
if (sep > 0)
System.err.println("Unexpected character "+ (char) sep));
丢失了很多信息。什么是生成输入?它可以有起始字节序列吗?它是空终止的吗?你如何决定何时停止阅读?一个新的开始需要清除缓冲区并重新开始读取什么?如果你不是过于简单化,并且一次读取5个字节,那么你可以在第一帧中尝试所有5个可能的帧位置,并丢弃失败的帧,当然,如果帧大得多,这些帧将不会飞行。要处理暂停或重新启动,您可以在检测到不匹配时重新启动进程。