FileServer

  1. package com.zhaowb.netty.ch13_1;
  2.  
  3. import io.netty.bootstrap.ServerBootstrap;
  4. import io.netty.channel.ChannelFuture;
  5. import io.netty.channel.ChannelInitializer;
  6. import io.netty.channel.ChannelOption;
  7. import io.netty.channel.EventLoopGroup;
  8. import io.netty.channel.nio.NioEventLoopGroup;
  9. import io.netty.channel.socket.SocketChannel;
  10. import io.netty.channel.socket.nio.NioServerSocketChannel;
  11. import io.netty.handler.codec.LineBasedFrameDecoder;
  12. import io.netty.handler.codec.string.StringDecoder;
  13. import io.netty.handler.codec.string.StringEncoder;
  14. import io.netty.util.CharsetUtil;
  15.  
  16. import java.io.File;
  17.  
  18. public class FileServer {
  19.  
  20. public void run(int port) throws Exception {
  21.  
  22. EventLoopGroup bossGroup = new NioEventLoopGroup();
  23. EventLoopGroup workerGroup = new NioEventLoopGroup();
  24. try {
  25. ServerBootstrap b = new ServerBootstrap();
  26.  
  27. b.group(bossGroup, workerGroup)
  28. .channel(NioServerSocketChannel.class)
  29. .option(ChannelOption.SO_BACKLOG, 100)
  30. .childHandler(new ChannelInitializer<SocketChannel>() {
  31. @Override
  32. protected void initChannel(SocketChannel ch) throws Exception {
  33. ch.pipeline().addLast(
  34. new StringEncoder(CharsetUtil.UTF_8),// 将文件内容编码为字符串
  35.  
  36. // 这2个解码器一起使用就是文本换行解码器
  37. new LineBasedFrameDecoder(1024),// 根据回车换行符对数据包进行解码
  38. new StringDecoder(CharsetUtil.UTF_8),// 将数据包解码成字符串,
  39.  
  40. new FileServerHandler()
  41. );
  42. }
  43. });
  44. ChannelFuture f = b.bind(port).sync();
  45. System.out.println("Start file server at port : " + port);
  46. f.channel().closeFuture().sync();
  47.  
  48. } finally {
  49. bossGroup.shutdownGracefully();
  50. workerGroup.shutdownGracefully();
  51. }
  52. }
  53.  
  54. public static void main(String[] args) throws Exception{
  55.  
  56. int port = 8080;
  57. new FileServer().run(port);
  58. }
  59. }

FileServerHandler

  1. package com.zhaowb.netty.ch13_1;
  2.  
  3. import io.netty.channel.ChannelHandlerContext;
  4. import io.netty.channel.DefaultFileRegion;
  5. import io.netty.channel.FileRegion;
  6. import io.netty.channel.SimpleChannelInboundHandler;
  7.  
  8. import java.io.File;
  9. import java.io.RandomAccessFile;
  10. import java.sql.SQLOutput;
  11.  
  12. public class FileServerHandler extends SimpleChannelInboundHandler<String> {
  13.  
  14. private static final String CR = System.getProperty("line.separator");
  15.  
  16. @Override
  17. protected void messageReceived(ChannelHandlerContext ctx, String msg) throws Exception {
  18. File file = new File(msg);
  19. // 校验文件的合法性,不存在构造异常消息返回。如果存在使用RandomAccessFile 以只读的方式打开文件,然后使用netty的
  20. // DefaultFileRegion 进行文件传输,
  21. // FileChannel file, 文件通道,用于对文件进行读写操作
  22. // long position,文件操作的指针位置,读取或写入的起始点
  23. // long count,操作的总字符数
  24. if (file.exists()){
  25. if (!file.isFile()){
  26. ctx.writeAndFlush("Not a file " + msg);
  27. return;
  28. }
  29. ctx.write(file +" " + file.length() + CR);
  30. RandomAccessFile randomAccessFile = new RandomAccessFile(msg,"r");
  31. FileRegion region = new DefaultFileRegion(randomAccessFile.getChannel(),0,randomAccessFile.length());
  32. ctx.write(region);
  33. ctx.writeAndFlush(CR); // 写入换行符,告诉CMD控制台,文件传输结束。
  34. randomAccessFile.close();
  35. }else {
  36. ctx.writeAndFlush("File not found " + file + CR);
  37. }
  38. }
  39. @Override
  40. public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
  41. cause.printStackTrace();
  42. ctx.close();
  43. }
  44.  
  45. @Override
  46. public void channelActive(ChannelHandlerContext ctx) throws Exception {
  47. System.out.println("连接成功!");
  48. }
  49. }

启动FileServer 之后再CMD控制台 输入 telnet localhost 8080

然后输入文件的绝对路径比如 D:\hello.txt ,在操作时,出现了中文乱码的问题,应该是Windows的原因。

netty 文件传输的更多相关文章

  1. Netty学习(十)-Netty文件上传

    今天我们来完成一个使用netty进行文件传输的任务.在实际项目中,文件传输通常采用FTP或者HTTP附件的方式.事实上通过TCP Socket+File的方式进行文件传输也有一定的应用场景,尽管不是主 ...

  2. Linux主机上实现树莓派的交叉编译及文件传输,远程登陆

    0.环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS:官网下的的raspb ...

  3. putty提供的两个文件传输工具PSCP、PSFTP详细介绍

    用 SSH 来传输文件 PuTTY 提供了两个文件传输工具 PSCP (PuTTY Secure Copy client) PSFTP (PuTTY SFTP client) PSCP 通过 SSH ...

  4. c# 局域网文件传输实例

    一个基于c#的点对点局域网文件传输小案例,运行效果截图 //界面窗体 using System;using System.Collections.Generic;using System.Compon ...

  5. 使用 zssh 进行 Zmodem 文件传输

    Zmodem 最早是设计用来在串行连接(uart.rs232.rs485)上进行数据传输的,比如,在 minicom 下,我们就可以方便的用 Zmodem (说 sz .rz 可能大家更熟悉)传输文件 ...

  6. 在windows 与Linux间实现文件传输(C++&C实现)

    要实现windows与linux间的文件传输,可以通过socket网络编程来实现. 这次要实现的功能与<Windows下通过socket进行字符串和文件传输>中实现的功能相同,即客户端首先 ...

  7. Windows下通过socket进行字符串和文件传输

    今天在windows平台下,通过socket实现了简单的文件传输.通过实现这一功能,了解基本的windows网络编程和相关函数的使用方法. 在windows平台上进行网络编程,首先都需要调用函数WSA ...

  8. Linux下几种文件传输命令 sz rz sftp scp

    Linux下几种文件传输命令 sz rz sftp scp 最近在部署系统时接触了一些文件传输命令,分别做一下简单记录: 1.sftp Secure Ftp 是一个基于SSH安全协议的文件传输管理工具 ...

  9. 艺萌TCP文件传输及自动更新系统介绍(TCP文件传输)(四)

    艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输) 该系统基于开源的networkComms通讯框架,此通讯框架以前是收费的,目前已经免费并开源,作者是英国的,开发时间5年多,框架很稳定. 项 ...

随机推荐

  1. https://blog.csdn.net/rubbertree/article/details/88877262

    本文链接:https://blog.csdn.net/rubbertree/article/details/88877262 https://blog.csdn.net/mingtianhaiyouw ...

  2. leetcode 596 BUG笔记

    There is a table courses with columns: student and class Please list out all classes which have more ...

  3. Ibatis sql语句

    <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE sqlMap PUBLIC "-/ ...

  4. 安装jdk 并放在 /usr/java/default 目录下

    安装步骤 . mkdir /usr/java 2. tar -xvf jdk*.tar.gz -C /usr/java/ 记得将* 换成版本即可3. ln -s /usr/java/jdk* /usr ...

  5. 搭建一个自己的SVN服务器

    其实方法非常简单,点点鼠标就好了. 上网搜索“VisualSVN Server”,一般来说都是会找到 https://www.visualsvn.com/server/ 这个网站的. 点击上边的Dow ...

  6. codeforces750E New Year and Old Subsequence 矩阵dp + 线段树

    题目传送门 思路: 先看一个大牛的题解 题解里面对矩阵的构造已经写的很清楚了,其实就是因为在每个字符串都有固定的很多中状态,刚好可以用矩阵来表达,所以$(i,j)$这种状态可以通过两个相邻的矩阵的$m ...

  7. linux 套接字

    三.命名套接字 之前的socket只是创建了一个没有名字的资源,其他进程无法访问他.所以也无法从它接受消息.只有当bind给套接字绑定了端口和名字后,其他进程才能找到它. 一般服务器是一定要bind, ...

  8. 链表list

    Don't  lost link! list与vector不同之处在于元素的物理地址可以任意. 为保证对列表元素访问的可行性,逻辑上互为前驱和后继的元素之间,应维护某种索引关系.这种索引关系,可抽象地 ...

  9. pycharm破解教程

    转载 查询 https://blog.csdn.net/u014044812/article/details/86679150

  10. php fopen用法以及解释

    $log = fopen('./log.txt','a');//生成一个log.txt文件,a相当于文件的权限 fwrite($log,'成功'."\r\n");//写入文件 mo ...