Java NIO框架Netty教程(十五)-利用Netty进行文件传输

如果您持续关注OneCoder,您可能会问,在《Java NIO框架Netty教程(十四) Netty中OIO模型(对比NIO)》中不是说下节介绍的是,NIO和OIO中的worker处理方式吗。这个一定会有的,只是在研究的过程中,OneCoder发现了之前遗留的文件传输的代码,所以决定先完成它。

 
其实,Netty的样例代码中也提供了文件上传下载的代码样例,不过太过复杂,还包括了Http请求的解析等,对OneCoder来说,容易迷惑那些才是文件传输的关键部分。所以OneCoder决定根据自己去写一个样例,这个理解就是在最开始提到的,Netty的传输是基于流的,我们把文件流化应该就可以传递了。于是有了以下的代码:

 

01./**
02.* 文件传输接收端,没有处理文件发送结束关闭流的情景
03.*
04.* @author lihzh
05.* @alia OneCoder
07.*/
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.@Override
28.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.net
06.* @author lihzh
07.* @alia OneCoder
09.*/
10.public class FileClientHandler extends SimpleChannelHandler {
11. 
12.// 每次处理的字节数
13.private int readLength = 8;
14. 
15.@Override
16.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准备另外单独介绍一下。

posted @ 2017-10-10 23:30  hashcoder  阅读(1475)  评论(1编辑  收藏  举报