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
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准备另外单独介绍一下。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值