2012-08-09 33 views
2

我有一個服務器 - 客戶端設置在TCP上,客戶端正在向服務器發送一些數據集。讀/寫使用ObjectInput/OutputStream。在正常情況下我沒有任何問題,但是當數據流量變大時,我得到一個StreamCorruptedException:無效的類型代碼。無效的代碼每次都不相同。我打開一次套接字並調用同步方法從多個線程發送數據。StreamCorruptedException ObjectInputStream上的數據量過大

客戶:

socket = new Socket("localhost", sockNum); 
out = new ObjectOutputStream(socket.getOutputStream()); 
in = new ObjectInputStream(socket.getInputStream()); 

public synchronized void sendMsg(Message msg){ 
    try{ 
     out.writeObject(security.signObject(msg, privKey)); 
     out.reset(); 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

服務器:

ServerSocket server = new ServerSocket(sockNum); 
Socket client = server.accept(); 
ObjectInputStream in = new ObjectInputStream(client.getInputStream()); 

while(threadActive){ 
    Object line = in.readObject(); 
    handleObject(line); 
} 

更新:我添加out.reset()後,每發,但這並沒有幫助的問題。我還在循環中添加了睡眠狀態以降低數據速率。這擺脫了錯誤,但不是一個真正的解決方案。

編輯:自從我最初提出這個問題以來有一段時間了,但我再次遇到了問題。我嘗試設置我的系統,以便在每次發送消息後,線程都會等待「確認」消息作爲回報。如果接收進程發生StreamCorruptedException,它將發送一個「重發」而不是ack。這似乎導致比解決方案更多的問題。任何其他想法?

+0

除了創建並關閉它們之外,該方法是唯一訪問'out'或'socket'的地方嗎? – 2012-08-09 18:34:07

+0

@JoachimIsaksson:sendMsg方法實際上包含在另一個跟蹤所有I/O變量的對象中。這個方法在我的進程中被多個線程調用。在這些線程中唯一調用的其他方法只調用'in.readObject()',它有一個超時。 – 2012-08-09 19:35:00

回答

2

這聽起來像是你正在以多線程的方式寫入輸出流,也就是說,你正在寫一個地方,而不是你的例子。

順便說一句:你是否定期重置()流,以防止內存泄漏?

+0

是的,我從多個線程調用sendMsg()。這有問題嗎?另外,我還沒有定期重置()流。我如何/何時這樣做以免失去從另一個線程發送的信息? – 2012-08-09 19:37:00

+0

如果在對象序列化時更改對象,則可能會破壞流。對象流會記住它發送的每個對象。使用reset()清除兩端的緩存。 – 2012-08-09 19:49:54

+0

這是否適用於嵌套對象?我正在發送一個SignedObject,其中包含一個消息,其中包含的數據在某些時候會發生變化。如果是這種情況,那麼我的數據流量增加可能會延遲傳輸足夠長的時間,從而產生影響。 – 2012-08-09 20:03:19

相關問題