如果您持续关注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
06.
* @blog http://www.coderli.com
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
08.
* @blog http://www.coderli.com
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准备另外单独介绍一下。
转载于:https://www.cnblogs.com/hashcoder/p/7648441.html
最后
以上就是淡定黑猫最近收集整理的关于Java NIO框架Netty教程(十五)-利用Netty进行文件传输的全部内容,更多相关Java内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复