[英]java Reading unknown formats from 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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.