いいタイトルを考えてみましたが、失敗したようです。これが私の問題です:
ソケットからデータを読み込んでいます。バッファに含まれるデータはシリアル化されたオブジェクトです。データが完全に読み取られたら、ObjectInputStreamを作成し、readObjectを使用してデータを読み込むことができます。
私の問題は、私のソケットクラスがバイトを読み取っているので...完全なオブジェクトを受け取ったことをどのように知ることができますか?オブジェクトの終わりのインジケーターがないようです。シリアル化されたバイトコードの内訳を探して長さフィールドを見つけることができるかどうかを確認しようとしましたが、シリアル化のバイトコードはGoogleで見つけることができる場所では十分に説明されていません。
私が受け取っているオブジェクトは、違いが生じる場合はハッシュマップ(java.util.Map)です。
これが私が使用しているコードの一部です:
long start = System.currentTimeMillis();
long end = start + (getTimeout() * 1000);
m_Ipports.send(dataToSend);
m_Waiting = true;
while (m_Waiting) {
// Data is read in a separate thread, and stored into the byte buffer m_DataIn
if (System.currentTimeMillis() > end) {
//throw new Exception("Timeout waiting for response.");
m_Waiting = false; // hack to get it to work. Times out every time.
}
m_Ipports.doEvents();
}
ByteArrayInputStream bis = new ByteArrayInputStream(m_DataIn.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
Object o = ois.readObject();
Map m = (Map)o;
だから、私の質問は、私がm_DataInを読んでいるときに、オブジェクトの終わりに到達したことをどのように判断するのですか?
注:これらのオブジェクトを受信しているサーバーを変更することはできません。それは私のコードではありません。
ありがとう。
チャールズ。