我正在开发一个客户端-服务器应用程序,该应用程序将使用UDP和数据包进行通信。
我将使用DataOutputStream和DataInputStream对这些数据包中的解码数据进行编码。
我想存储数据的方式是在从另一个自定义基本数据包类扩展而来的自定义数据包类中。
这个数据包基类包含一个对象列表,即数据包数据(这些对象将有多种格式;String、Int、Boolean…),并将使用以下方法编码为DataOputStream:
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语句来为读取的每个对象做准备。
这显然会给我的数据包添加更多的数据,这不是最优的。然而,我想这样做的原因是为了避免对每个读取的数据(可能是数百个数据包)进行硬编码。
我真正的问题是,这是否是一种明智的方式?或者,有没有一种更简单的方法可以通过定制的结构化数据包进行发送,并在不一定知道数据格式的情况下从另一端读取它们。。?
显然,你必须在每个项目之前写一个令牌,宣布它的类型
或者使用ObjectOutputStream,只写和读对象,并在*receive*端使用instanceof。