编码简约消息的最佳方式

时间:2014-01-11 11:00:31

标签: java sockets encoding message

我需要创建一个应该传输数据的小客户端/服务器应用程序:

statistic< - 命令类型标识符

15.23.63.12< - 此IP地址的统计信息

increase< - 应使用地址统计信息执行的操作

6< - 只是其他一些参数......

因此必须有一个字符串来标识命令的类型,然后根据命令类型应该有一些参数。这些参数不同但始终是原始数据类型。最有可能是String,Short,Byte,Integer等......

因此存在不同原始数据类型的指令集。

我的问题是:这是在DataInput / OutputStreams中包装套接字流并且只是从它们读取/写入的最佳方法吗?或者最好将消息保存到字节数组中,然后将此字节数组包装在ByteArrayInputStream中,并将ByteArrayInputStream包装在我可以读取的DataInputStream中?或者我应该将字节数组包装在ByteBuffer

如果我想加密我的消息,我是否必须将它们保存为字节数组,然后解密字节数组然后将其包装到某种数据读取器中?

1 个答案:

答案 0 :(得分:1)

如果这就是你所要求的,你可以做得更“有效”。

如果您没有超过255种不同的模式,我会使用字节对命令类型修饰符进行建模:

byte cmd_statistic = 0;
byte cmd_nonstatistic = 1;

然后每个ip地址可以建模为4个字节,如下所示:

byte[] ip0 = new byte[]{15, 23, 63, 12};
byte[] ip1 = new byte[]{15, 23, 63, 13};

动作也可以是字节:

byte action_increase = 0;
byte action_decrease = 1;

如果您可以将最后一个参数建模为字节,只需使用InputStreams(is)和OutputStreams就可以实现:

// Code for reading, writing is very similar
byte cmd = (byte)is.read();

byte[] ip = new byte[4];
is.read(ip, 0, 4);

byte action = (byte)is.read();
byte extra  = (byte)is.read();

这也很容易保存在大字节[]中,并且更容易用于加密