0

我的工作一些網絡與Java和我有一個對象轉換爲一個字節數組,分割該陣列分成2份,發送每個通過TCP流,接收它,重建所述的問題字節數組,然後重新對象。爪哇 - 無效流頭

到目前爲止,這一切都工作。除了對象的重建之外,我擁有所有這些。使用ObjectInputStream時出現此錯誤:

java.io.StreamCorruptedException: invalid stream header: 34323435 

這是我在線看到的常見錯誤。我試圖修復它。我聽說的原因之一是在發送字節後流不會被刷新,但是我的代碼在發送之前確實會流水。我的代碼發送數據是:

public void sendTcp(ObjectOutputStream tcpOut) { 
    try { 
     synchronized(tcpOut) { 
      tcpOut.write(data); 
      tcpOut.flush(); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

而且我能夠成功讀取服務器端的這些字節。將這些字節組合在一起時會出現問題。一旦完成,我用它來重新創建對象:

ByteArrayInputStream in = new ByteArrayInputStream(data); 
ObjectInputStream is = new ObjectInputStream(in); 
Object object = is.readObject(); 
is.close(); 
in.close(); 

但是在ObjectInputStream行上會拋出錯誤。我也通過調試查看了原始數據,並且它們都匹配起來。對象的字節在被拆分併發送之前,與接收後重新組合的字節相匹配。我一直堅持這一點,如果有人可以幫助,這將是非常有益的。

+1

你能夠建立基於相同的字節在客戶端的對象? –

+0

我已經嘗試過,但是我所做的是首先創建一個新的ByteArrayOutputSteam,然後創建一個新的ObjectOutputStream,然後編寫該對象並獲取該對象的字節。然後我沖洗並關閉這些流。然後我把這個數組分成幾部分,然後通過連接到Socket輸出流的ObjectOutputStream發送每個數組(對於套接字只有一個對象輸出流,我不重新創建它)。然後我在服務器端接收它並將這些陣列放在一起。 – Jmrapp

+0

然後我把那個單個數組發送給一個新的ByteArrayInputStream,然後把它發送給一個新的ObjectInputStream。然後我使用它來獲取對象,但它創建ObjectInputStream時會引發該錯誤 – Jmrapp

回答

1

我在將對象轉換爲字節數組,將該數組拆分爲2部分,通過TCP流發送每個數據,接收數據,重構字節數組,然後重新構造對象時出現問題。

當然你。沒有用。這裏有太多的毛病。你過度複雜化並在過程中犯錯誤。你不需要這些。這只是浪費時間和空間。 TCP已經分裂成細分市場; IP已經分裂成分組,並且路由器已經分裂成分段。您不需要添加其他圖層。

  • 擺脫ByteArrayOutputStreamByteArrayInputStream
  • 的創建一個ObjectOutputStream和按順序一個ObjectInputStream,,圍繞插座輸出包裹並分別輸入流,在兩端,並讓他們套接字
  • 的生活
  • 直接在這些對象流上使用writeObject()readObject()
  • 不在同一個套接字上使用任何其他流或讀取器或編寫器。
+0

這不是我要找的東西。我不認爲你明白我的意思是分裂。當通過流發送字節時,您僅限於發送的數量,我認爲它大約是64k。那麼當你有200k字節時會發生什麼?通過分割它,我可以將它們發送並重新創建它們。這通常稱爲數據包流式傳輸。無論如何,我發現我的問題是我沒有刪除從插入的一些字節,我插入並忘記刪除。所以我在技術上的一切工作都很好。 – Jmrapp

+0

當你試過這個,它不起作用,讓我知道。我不會屏住呼吸。目前你只是在猜測,而你錯了。顯然你沒有嘗試過這裏推薦的東西。通過流發送字節時,不受任何限制,更不用說64k了。當你有200k字節時,只需發送它們。如上所述,任何'數據包流傳輸'都需要TCP和IP來完成。不需要進一步的用戶干預。你的問題和評論沒有意義。 – EJP