您的位置:首页 > 编程语言 > Java开发

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

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

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

view
sourceprint?

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.
}


view
sourceprint?

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准备另外单独介绍一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: