some example to send big file from server to client?
Trustin Lee
tlee at redhat.com
Thu May 21 15:28:41 EDT 2009
Actually you can achieve more reliable and faster transfer using
ChannelFutureListener. The following is the code snippet I used when
I write an HTTP-based file server:
ChannelFuture writeFuture = e.getChannel().write(httpResponseHeader);
final long fileLength = file.length();
final FileInputStream fis = new FileInputStream(file);
writeFuture.addListener(new ChannelFutureListener() {
private final ChannelBuffer buffer = ChannelBuffers.buffer(4096);
private long offset = 0;
public void operationComplete(ChannelFuture future)
throws Exception {
if (!future.isSuccess()) {
future.getCause().printStackTrace();
future.getChannel().close();
fis.close();
return;
}
System.out.println("SENDING: " + offset + " / " + fileLength);
buffer.clear();
buffer.writeBytes(fis, (int) Math.min(fileLength - offset,
buffer.writableBytes()));
offset += buffer.writerIndex();
ChannelFuture chunkWriteFuture =
future.getChannel().write(buffer);
if (offset < fileLength) {
// Send the next chunk
chunkWriteFuture.addListener(this);
} else {
// Wrote the last chunk - close the connection if the
write is done.
System.out.println("DONE: " + fileLength);
chunkWriteFuture.addListener(ChannelFutureListener.CLOSE);
fis.close();
}
}
});
— Trustin Lee, http://gleamynode.net/
On Fri, May 22, 2009 at 3:48 AM, Frederic Bregier <fredbregier at free.fr> wrote:
>
> Hi,
>
> I think that you can even improve it by taking care of write ability like
> "discard" example shows. Indeed, in your code, if the network link is slow,
> you can have the side effect in the client to fill the write queue so much
> that there will be an OOME.
>
> A simple implementation idea could be as follow (from your code example):
>
> FileInputStream fis = new FileInputStream(f);
> int len;
> byte[] bs = new byte[1024];
> while ((len = fis.read(bs)) > 0) {
> ChannelBuffer buffer = ChannelBuffers.copiedBuffer(bs);
> // directly create and copy the ChannelBuffer from the
> byte array
> while (! channel.isWritable()) {
> Thread.sleep(10); // wait a while (maybe more than
> 10ms)
> // until channel is writable again
> }
> channel.write(buffer);
> }
> fis.close();
>
> Of course, if you have a client Handler, then you can directly code this in
> the handler such that you can even prevent your code of this active wait
> loop (see Discard example to see how).
>
> HTH too,
> Frederic
>
>
> tantom wrote:
>>
>> hi
>>
>> thanks,it's ok. below it's my test code,i post it hope to help next who
>> encount same with me:)
>>
>> File f = new File("g:\\test.msi");
>> String params = "GetFile|test.msi";
>> byte[] bsParams = params.getBytes("UTF-8");
>> ChannelBuffer response = ChannelBuffers.buffer(8 +
>> bsParams.length);
>>
>> response.writeBytes(CTypeConvert.int2byte(bsParams.length));
>> response.writeBytes(CTypeConvert.int2byte((int)
>> f.length()));
>> response.writeBytes(bsParams);
>>
>> //write the header info first
>> channel.write(response);
>>
>>
>> FileInputStream fis = new FileInputStream(f);
>> int len;
>> byte[] bs = new byte[1024];
>> while ((len = fis.read(bs)) > 0) {
>> ChannelBuffer buffer = ChannelBuffers.buffer(len);
>> buffer.writeBytes(bs);
>> channel.write(buffer);
>> }
>> fis.close();
>>
>
>
> -----
> Hardware/Software Architect
> --
> View this message in context: http://n2.nabble.com/some-example-to-send-big-file-from-server-to-client--tp2952981p2953620.html
> Sent from the Netty User Group mailing list archive at Nabble.com.
>
> _______________________________________________
> netty-users mailing list
> netty-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/netty-users
>
More information about the netty-users
mailing list