2014-03-03 44 views
0

我正在开发一个将使用UDP和数据包进行通信的客户端服务器应用程序。java从DataInputStream中读取未知格式

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

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

该分组基类包含对象的列表,分组数据,(这些对象将在多种格式;字符串,整数,布尔...)和将利用以下的方法进行编码,以一个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()读取它们。例如。

我曾经想过的一种方法是在每个发送的对象之前发送一个字节对象类型标识符。 I.e int将为0,UTF将为1,依此类推。这将允许我通过在字节类型标识符上使用case语句来准备读取每个对象。

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

我的问题真的是,如果这是一个明智的方式去做这件事?还是有更简单的方式通过自定义结构化数据包发送,并在另一侧读取它们,而不必知道数据格式..?

回答

1

显然你必须在每个项目前面写一个标记来宣告它是什么类型。

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

+0

这就是我虽然谢谢,我已经结束了写DataOutputStream类和DataInputStream类的包装,基本上只是做这个的: 公共无效\t writeByteUT(INT V)抛出IOException异常{ \t \t super.writeByte(StreamDataType。 BYTE.toByte()); \t \t super.writeByte(v); \t} –