java 从 DataInputStream 读取未知格式

标签 java io packets datainputstream

我正在开发一个客户端服务器应用程序,它将使用 UDP 和数据包进行通信。

我将使用 DataOutputStream 和 DataInputStream 对这些数据包中的数据进行编码和解码。

我想要存储数据的方式是在从另一个自定义基本数据包类扩展的自定义数据包类中。

此数据包基类包含对象列表、数据包数据(这些对象将采用多种格式;String、Int、Boolean...),并将使用以下方法编码到 DataOuputStream:

public ByteArrayOutputStream getDataOS(){
    ByteArrayOutputStream data = new ByteArrayOutputStream();
    DataOutputStream os = new DataOutputStream(data);

    try {
        for(Object obj : packetData){
            if(obj instanceof String)
                os.writeUTF((String) obj);
            else if(obj instanceof Integer)
                os.writeInt((int) obj);
            else if(obj instanceof Byte)
                os.writeByte((Byte) obj);
            else if(obj instanceof Double)
                os.writeDouble((double) obj);
            else if(obj instanceof Boolean)
                os.writeBoolean((Boolean) obj);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } 

    return data;
}

这个 ByteArrayOutputStream 然后将被发送到我的数据包处理程序并转发到客户端/服务器。

我遇到的障碍是如何在另一端读取此数据包 DataInputStream。

由于我不知道每个对象的格式,因此我将无法使用 is.readUTF() 读取它们;例如。

我想到解决这个问题的一种方法是在每个发送的对象之前发送一个字节对象类型标识符。即 int 为 0,UTF 为 1,依此类推。这将使我能够通过在字节类型标识符上使用 case 语句来准备读取的每个对象。

这显然会向我的数据包添加更多数据,这不是最佳的。然而,我想这样做的原因是为了避免对每个(可能是数百个数据包)读取的每个数据进行硬编码。

我真正的问题是,这是否是解决此问题的明智方法?或者是否有一种更简单的方法来发送自定义结构化数据包,并在另一端读取它们,而不必知道数据格式..?

最佳答案

显然,您必须在每个项目之前编写一个标记,以宣布其类型。

或者使用 ObjectOutputStream 只写入和读取对象,并在*接收*端使用instanceof。

关于java 从 DataInputStream 读取未知格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22156832/

相关文章:

python - 如何使用 python 2.7 创建具有希伯来文名称的文件?

java - Telnet基本IO操作

java - 为什么这两个代码没有给出相同的输出?

java - 将Java连接到MySQL数据库

Java 读取当前打开用于写入的文本文件

python - 使用python解码tcp数据包

networking - 如何从延迟和带宽计算数据包时间

c - ip4 数据包组装为 ip6 - libnet

java - 并发 hashmap 可以处理多达 10000 个线程而不发生死锁吗?

java - Factory设计的实现,在Spring Boot中遇到这个错误