【问题标题】:Best way to encode minimalistic messages编码简约消息的最佳方式
【发布时间】:2014-01-11 11:00:30
【问题描述】:

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

statistic

15.23.63.12

increase

6

所以必须有一个字符串来标识命令的类型,然后应该有一些参数取决于命令类型。此参数是不同的但始终是原始数据类型。很可能是 String、Short、Byte、Integer 等等……

所以有不同原始数据类型的指令集。

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

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

【问题讨论】:

  • A ByteArrayInputStream,顾名思义,允许从内存中的字节数组中读取。您将无法使用 ByteArrayInputStream 从服务器或客户端读取任何内容。显然,要通过套接字进行通信,您必须读取/写入套接字流。我建议使用 JSON 将对象序列化为字节,或者直接使用 ObjectOuntputStream 直接发送 Java 对象。

标签: java sockets encoding message


【解决方案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();

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

【讨论】:

  • 谢谢 :D 这确实是解决问题的好方法。如果我必须存储字符串,我就必须使用校验和,不是吗?如果是关于使用字符串,这种技术是否比数据输出流更快?或者我也可以使用 DataOutputStream?
  • 如果你想真正有效率,我会检查你的字符串的内容,如果可能的话,我会把每个字母翻译成一个字节,这样,你可以获得一个字节[]你的字符串长度相同。通常字符串中的每个字母都由一个 char 表示,即 16 位(2 个字节),但是如果您不想支持很多不同的语言而只想写成 'a' -> 'z',这只有 26 个字母,您会看到一个包含 256 个不同值的字节甚至太多了。我相信你可以用这些信息想出一个好的解决方案:)
  • 我将扩展 DataOutputStream 和 DataInputStream 并添加读取/写入 ASCII 字符串、IPv4 地址和所有这些东西的方法。
  • 如果你想保持轻便,我会扩展 InputStream 和 OutputStream 并使用 String getBytes for String 到 byte[] 方法,然后添加一个 sendIp(byte b0, byte b1, byte b2, byte b3 )。如果您需要发送整数和类似的东西,将整数转换为字节 [] 也不难。
  • 但这就是 datainputstream 和 dataoutputstream 所做的。所以我可以扩展它们。因为我无法从套接字扩展 eh 流。我可以扭曲它们。
猜你喜欢
  • 2013-09-11
  • 2013-08-07
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
相关资源
最近更新 更多