標籤: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進行檔案傳輸