java - 编码简约消息的最佳方式

标签 java sockets encoding message

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

统计 <-命令类型标识符

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

增加 <- 应使用地址统计信息执行的操作类型

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

因此必须有一个字符串来标识命令的类型,然后应该有一些取决于命令类型的参数。这些参数不同,但始终是原始数据类型。最有可能的是字符串、短整型、字节、整数等等...

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

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

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

最佳答案

如果您有这样的要求,您可以做得更“高效”。

我会使用字节对命令类型修饰符进行建模,前提是您没有超过 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();

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

关于java - 编码简约消息的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21061433/

相关文章:

java - 安卓蓝牙 : cannot write a Characteristic (no PROPERTY_WRITE)

java - SmartGWT imgbutton 工具提示

.net - 当套接字连续接收到超出程序处理能力的数据时会发生什么?

c++ - UDP 传输和维护网络字节顺序

animation - GIFEncoder.Class.php 和一个无循环 GIF 动画

java - 使用 Spring @RequestParam 无法在 Controller 中获取 '#' 符号

java - 如何强制Gradle重新编译所有子项目源?

java - Spring Boot 升级时找不到 log4j 文件问题

c - getpeername函数的理解

python - 使 Emacs 在 Python 交互模式下使用 UTF-8