我正在开发一个客户端服务器应用程序,它将使用 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/