在Java中解析数据报的有效方法

时间:2015-03-26 21:36:38

标签: java sockets udp

现在我正在使用套接字和数据报包。该程序用于LAN网络,每秒发送至少30个数据包,最多500个字节。

这就是我收到数据的方式

payload = new String(incomingPacket.getData(), incomingPacket.getOffset(), incomingPacket.getLength(), "UTF-8");

目前我没有使用偏移量,我逐个解析每个字符。我现在使用前2个字符来确定它是什么类型的消息但是可能会发生变化,然后我分解变量并用感叹号分隔数据,告诉我下一个变量何时开始。最后我解析它并将其应用到我的程序中。是否有更快的方法来分解和解释数据报包?如果我将变量的长度放在偏移量中,是否会有性能差异。也许一个例子会很有用。另外我认为我的变量太小而无法使用StringBuilder,因此我使用常规连接。

2 个答案:

答案 0 :(得分:0)

您在这里谈论的是建立自己的通信协议。虽然我将此作为socket tutorial的第四部分(我目前正在处理第3部分,非阻塞套接字),但我已经在这里解释了一些内容。

根据您的需要,有几种方法可以设置此类协议。 一种方法是在每个数据前面有一个字节,以字节为单位声明大小。这样,您就知道包含下一个变量值的字节数组的长度。这样可以通过System.arraycopy方法一次性读出整个变量。这是我之前使用的方法。如果要发送的对象始终相同,则只需执行此操作即可。以标准化顺序编写变量,添加变量值的大小并完成。

如果您必须通过流发送多种类型的对象,则可能需要添加一些元数据。然后,可以使用此元数据来指示正在发送的对象类型和变量的顺序。然后可以将此元数据放入您在实际消息之前添加的标头中。再一次,标题中的值前面是大小字节。

在我的tutorial中,我会写一个完整的代码示例。

答案 1 :(得分:0)

根本不要使用String。只需直接处理底层字节数组:扫描分隔符,计数,你有什么。如果您希望API面向Java原始数据类型,则可以使用缠绕在字节数组周围的DataInputStream {。}}。