我有一個服務器 - 客戶端設置在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。這似乎導致比解決方案更多的問題。任何其他想法?
除了創建並關閉它們之外,該方法是唯一訪問'out'或'socket'的地方嗎? – 2012-08-09 18:34:07
@JoachimIsaksson:sendMsg方法實際上包含在另一個跟蹤所有I/O變量的對象中。這個方法在我的進程中被多個線程調用。在這些線程中唯一調用的其他方法只調用'in.readObject()',它有一個超時。 – 2012-08-09 19:35:00