Java NIO架構Netty教程(十五)-利用Netty進行檔案傳輸

來源:互聯網
上載者:User

標籤:receive   alt   nta   get   context   connected   技術分享   處理   記憶體   

如果您持續關注OneCoder,您可能會問,在《Java NIO架構Netty教程(十四) Netty中OIO模型(對比NIO)》中不是說下節介紹的是,NIO和OIO中的worker處理方式嗎。這個一定會有的,只是在研究的過程中,OneCoder發現了之前遺留的檔案傳輸的代碼,所以決定先完成它。

 
其實,Netty的範例代碼中也提供了檔案上傳下載的代碼範例,不過太過複雜,還包括了Http請求的解析等,對OneCoder來說,容易迷惑那些才是檔案傳輸的關鍵區段。所以OneCoder決定根據自己去寫一個範例,這個理解就是在最開始提到的,Netty的傳輸是基於流的,我們把檔案流化應該就可以傳遞了。於是有了以下的代碼:

 

view sourceprint?01./**02.* 檔案傳輸接收端,沒有處理檔案發送結束關閉流的情景03.*04.* @author lihzh05.* @alia OneCoder06.* @blog http://www.coderli.com07.*/08.public class FileServerHandler extends SimpleChannelHandler {09. 10.private File file = new File("F:/2.txt");11.private FileOutputStream fos;12. 13.public FileServerHandler() {14.try {15.if (!file.exists()) {16.file.createNewFile();17.} else {18.file.delete();19.file.createNewFile();20.}21.fos = new FileOutputStream(file);22.} catch (IOException e) {23.e.printStackTrace();24.}25.}26. 27.@Override28.public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)29.throws Exception {30.ChannelBuffer buffer = (ChannelBuffer) e.getMessage();31.int length = buffer.readableBytes();32.buffer.readBytes(fos, length);33.fos.flush();34.buffer.clear();35.}36. 37.}

 

view sourceprint?01./**02.* 檔案發送用戶端,通過位元組流來傳送檔案,僅實現檔案傳輸部分,<br>03.* 沒有對檔案傳輸結束進行處理<br>04.* 應該傳送檔案發送結束標識,供接受端關閉流。05.* www.it165.net06.* @author lihzh07.* @alia OneCoder08.* @blog http://www.coderli.com09.*/10.public class FileClientHandler extends SimpleChannelHandler {11. 12.// 每次處理的位元組數13.private int readLength = 8;14. 15.@Override16.public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e)17.throws Exception {18.// 傳送檔案19.sendFile(e.getChannel());20.}21. 22.private void sendFile(Channel channel) throws IOException {23.File file = new File("E:/1.txt");24.FileInputStream fis = new FileInputStream(file);25.int count = 0;26.for (;;) {27.BufferedInputStream bis = new BufferedInputStream(fis);28.byte[] bytes = new byte[readLength];29.int readNum = bis.read(bytes, 0, readLength);30.if (readNum == -1) {31.return;32.}33.sendToServer(bytes, channel, readNum);34.System.out.println("Send count: " + ++count);35.}36. 37.}38. 39.private void sendToServer(byte[] bytes, Channel channel, int length)40.throws IOException {41.ChannelBuffer buffer = ChannelBuffers.copiedBuffer(bytes, 0, length);42.channel.write(buffer);43.}44. 45.}

 

待發送的檔案1.txt內容如下:

 


 

運行上述代碼,接受到的檔案2.txt結果:

 


 

完全一模一樣。成功!
 
這隻是一個簡單的檔案傳輸的例子,可以做為範例借鑒。對於大檔案傳輸的情景,本範例並不支援,會出現記憶體溢出的情景,OneCoder準備另外單獨介紹一下。

Java NIO架構Netty教程(十五)-利用Netty進行檔案傳輸

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.