2015-11-01 33 views
1

我的問題很簡單,乍一看雖然不是。我的android應用程序使用方法writeObject()通過ObjectOutputStream(OOS)發送對象。 一切都很好,直到我試圖在短時間內發送幾個對象(看起來像那件事)。所以,想象,我不喜歡水木清華:ObjectOutputStream在一行中讀取多個對象

服務器端:

public void someMethod(){ 
    sendObjectA(objA); 
    sendObjectB(objB); 
} 

public void sendObjectA(ObjectA obj){ 
    getObjectOutputStream().writeObject(obj); 
    getObjectOutputStream().flush(); 
} 

public void sendObjectB(ObjectB obj){ 
    getObjectOutputStream().writeObject(obj); 
    getObjectOutputStream().flush(); 
} 

客戶端

public void method read(){ 
    while (true){ 
     Object receivedObject = inputStream.readObject(); 
     if (receivedObject instanceof ObjectA){ 
       doAThings(); 
     } else if (receivedObject instanceof ObjectB){ 
       doBThings(); 
     } 
} 

...捕獲異常等

而且它發生在某種程度上是doAThings()方法永遠不會被調用,它看起來更像是這個objectA永遠不會來。

在調試過程中,我注意到,在我寫入objA到流之後,程序開始向它寫入objB(當然,很明顯的行爲,但是...)但客戶端沒有收到objA(我也嘗試調試客戶端)。我把一個斷點在該行

Object receivedObject = inputStream.readObject(); 

而且只當它收到objB停止。

沒有引發任何異常,logcat中沒有錯誤(如nonSerializable等),沒有任何異常。

另外我想補充一點,我不會那麼滿意接受某種解決方法。我真的很想了解問題的根源。我已經閱讀了大量不同的教程,關於Java IO,流等的文檔,但仍然不知道爲什麼會發生這樣的事情。例如,flush()方法應該刷新任何寫入的數據,即將其傳遞到目標點,但在我的情況下它不會。它看起來只是用新的數據覆蓋以前寫入的數據。

P.S.我也使用套接字,所以接收器 - 是通過Wi-Fi連接的設備

回答

0

聽起來好像你在你的ObjectOutputStream和套接字之間有BufferedOutputStream。雖然這是一個好主意,它意味着:

  • 您需要直接沖洗()的ObjectOutputStream您構建後,並試圖構建相應ObjectInputStream
  • 之前,如果你想對閱讀對象作爲你沒有滯後地產生它們,你需要在每個writeObject()呼叫後沖洗ObjectOutputStream
+0

謝謝你的回答。那麼,在我將它們寫入流之後,我會立即刷新objectoutputstream。但是,你的意思是「你需要在構造它之後直接刷新()ObjectOutputStream」?你能解釋一下這個是什麼意思,它會是什麼樣子? –

相關問題