Java 字节序列成帧

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个字节最简单

假设我从网络中获得一个字节序列,顺序如下: X=X X=X X=X X X=X X X=。。。等等 您可以立即注意到消息的模式是5个字节的序列:X= X当然可以是除“=”之外的任何数字

现在,传输周期性地发生。 在某个时刻,我的应用程序正在启动并获取字节序列

获取这些字节并将其帧化为5字节消息的最佳算法是什么? 有两个问题: 1.您如何找到第一条消息?我想我需要删除一些字节直到得到“=”对吗?
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个可能的帧位置,并丢弃失败的帧,当然,如果帧大得多,这些帧将不会飞行。要处理暂停或重新启动,您可以在检测到不匹配时重新启动进程。