Reputation: 857
I have a Java client-server (using ocsf if anyone here knows it) infrastructure I am using to upload files from client to server. The client is actually an Android app (not sure if that matters that much or not in this case)
I am doing this by reading the file data (bytes), wrapping it in an object that contains some other details (user id, etc..) and sending this object over ObjectOutputStream
to the server.
It seems everything works fine until the byte array of the file is over a certain size (not sure what this strange threshold is yet but it seems 645KB is already too much). Then, the server throws a StreamCorruptedException
when trying to read the object from the ObjectInputStream
and closes the socket.
The code of the object message containing the file bytes:
public class MessageUploadFile extends MessageToServer {
private static final long serialVersionUID = 2356276507283427913L;
private String _destId;
private TransferDetails _td;
private byte[] _fileData;
public MessageUploadFile(String srcId, TransferDetails td, byte[] fileData){
super(srcId);
_destId = td.getDestinationId();
_td = td;
_fileData = fileData;
}
The client side socket and streams initialization:
clientSocket= new Socket(host, port);
output = new ObjectOutputStream(clientSocket.getOutputStream());
input = new ObjectInputStream(clientSocket.getInputStream());
Sending the message using:
output.writeObject(msg);
These are the streams initialization on the server side:
input = new ObjectInputStream(clientSocket.getInputStream());
output = new ObjectOutputStream(clientSocket.getOutputStream());
Reading the message using:
msg = input.readObject();
Upvotes: 1
Views: 177
Reputation: 38910
StreamCorruptedException
A Java StreamCorruptedException
can be thrown while deserialising data. It essentially occurs in one of two main cases:
you try to open an ObjectInputStream
around some data that wasn't actually written using an ObjectOutputStream
OR
During a readObject()
operation, the stream gets in the "wrong place".
From java docs:
Thrown when control information that was read from an object stream violates internal consistency checks.
But I got this exception with large message and moved to byte array solution.
Have a look at this article:http://www.javamex.com/tutorials/io/StreamCorruptedException.shtml
In summary, convert Object to and from byte array and re-create it.
Upvotes: 1
Reputation: 857
What I did eventually is initially send an object indicating the upload details (fileSize, sender id, etc..) and then on the server side grabbed the underlining inputStream that was in the ObjectInputStream and transferred just the bytes of the files separately. Once finished the client and server continue to communicate via objects. It works fine for now.
Hope this helps someone.
Upvotes: 0