2009-09-28 108 views
0

我正在一個excepetion當我試圖從ObjectInputStream讀取對象通過網絡這樣的:Objectdeserialization通過網絡

Socket socket = new Socket("localhost", 4444); 
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); 
while ((Object o = ois.readObject()) != null) { 
} 

這裏是例外,我得到:

 
java.io.EOFException 
    at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source) 
    at java.io.ObjectInputStream.readObject0(Unknown Source) 
    at java.io.ObjectInputStream.readObject(Unknown Source) 

連接本身似乎很好,因爲我能夠通過網絡讀取字符串,但對象不工作。

因爲它是一個EOFExcepetion,我假設該流當前不再發送數據。 (在第一個對象被髮送後這是可以的)。 所以我在想也許我正在使用objectdeserialization錯誤的方式?

這裏有什麼問題?謝謝!

+0

服務器端是什麼樣的?你如何結束連接? – 2009-09-28 15:11:19

+0

服務器不會結束連接。它序列化一個對象,然後通過outputstream.writeObject() – clamp 2009-09-28 15:17:26

+0

將它發送給客戶端好的抱歉,我剛發現確實存在服務器上關閉連接的問題。 – clamp 2009-09-28 15:54:36

回答

2

爲什麼不打電話available()檢查是否有東西要讀?這可能值得發佈你的服務器端代碼。目前我們只看到故事的一面。

+0

但這是否準確?如果只有一半的對象二進制數據被接收到,怎麼辦?一旦它再次結束,它會立即崩潰。 – clamp 2009-09-28 15:11:41

+1

我希望readObject()能夠阻塞,直到出現所有需要的數據爲止(除非出現異常情況)。不要忘記,在TCP的封面下,您可以爲您管理數據的完整性和完整性。 – 2009-09-28 15:13:20

+0

好吧我試過可用(),它似乎總是返回0,這將解釋EOFException。但我如何調試呢?我肯定會向客戶發送一個對象,所以它應該在那裏。 – clamp 2009-09-28 15:24:06