概述
如果您持续关注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 NIO框架Netty教程(十五)-利用Netty进行文件传输所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复