标签:receive alt nta get context connected 技术分享 处理 内存
如果您持续关注OneCoder,您可能会问,在《Java NIO框架Netty教程(十四) Netty中OIO模型(对比NIO)》中不是说下节介绍的是,NIO和OIO中的worker处理方式吗。这个一定会有的,只是在研究的过程中,OneCoder发现了之前遗留的文件传输的代码,所以决定先完成它。
其实,Netty的样例代码中也提供了文件上传下载的代码样例,不过太过复杂,还包括了Http请求的解析等,对OneCoder来说,容易迷惑那些才是文件传输的关键部分。所以OneCoder决定根据自己去写一个样例,这个理解就是在最开始提到的,Netty的传输是基于流的,我们把文件流化应该就可以传递了。于是有了以下的代码:
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.}
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进行文件传输
标签:receive alt nta get context connected 技术分享 处理 内存
原文地址:http://www.cnblogs.com/hashcoder/p/7648441.html