Archived
This forum has been archived. Please start a new discussion on GitHub.
Transferring files/large data blocks
I would like to be able to pass (potentially large) files between a server and client using ice... I've tried using sequence<byte> and it worked just fine at first but when the files got to a few Mbs things stopped working... (I got an unknown exception from the remote operation)
My setup is something like this:
sequence<byte> ByteData;
interface Client {
void uploadFile( string filename, ByteData data );
};
interface Server {
void login( Client* cli );
};
// in client
server->login( client );
// in server
void
ServerI::login( ClientPrx client, ..... )
{
// read file data
client->uploadFile( filename, data );
}
---
This works for small files, eg the test file I used first was 71k...
For larger files I get "Unknown exception" in the server and ClientI::uploadFile is never reached on the client...
So, is there a recommended way to do this?
My setup is something like this:
sequence<byte> ByteData;
interface Client {
void uploadFile( string filename, ByteData data );
};
interface Server {
void login( Client* cli );
};
// in client
server->login( client );
// in server
void
ServerI::login( ClientPrx client, ..... )
{
// read file data
client->uploadFile( filename, data );
}
---
This works for small files, eg the test file I used first was 71k...
For larger files I get "Unknown exception" in the server and ClientI::uploadFile is never reached on the client...
So, is there a recommended way to do this?
0
Comments
-
I think that you should consider a chunked transfer approach.
Something like:
sequence<byte> ByteData;
interface Receiver {
void receive( ByteData data);
void close();
};
interface Server {
Receiver *transfer( string filename);
};
Your client will send multiple chunks of the original file
invoking multiple receive() until EOF.
I have used this approach in Java and it is really ***fast***
(well, ftp is a little bit faster but....you have no objects !!)
You can experience the performances using different chunk size.
64K it is rather good.
Hope it helps,
Guido.0 -
Hmm... you shouldn't get an UnknownException, but instead a MemoryLimitException.
You can increase the max message size by setting the property Ice.MessageSizeMax. The default is 1024, meaning 1024 KB = 1MB. Try setting it to a larger value, like 10240 = 10MB.
For more information, have a look at the description of the MessageSizeMax property in the manual's reference section.
If you would like to see an example for transferring arbitrary long files in "chunks", have a look at the code of IcePatch in src/IcePatch.0 -
Thanks... Good stuff...0