该组件基于netty3.6.3实现,具有如下功能:文件上传,文件替换,文件删除,如果是图片的话,还可以生成缩略图等功能。
使用简单,只需要引入netty-file-client,即可以实现文件的以上操作。
该组件的代码结构分为两部分,客户端组件(netty-flie-client)和服务端组件(netty-flie-server)。如下图所示:
客户端组件主要提供对外访问服务端组件的接口,提供以下接口:文件上传,文件替换,文件删除,如果是图片的话,还可以生成缩略图等功能。代码结构如下:
org.lyx.file.client包是该组件的核心包,FileClient类是对外提供接口的工具类。具有以下方法:
uploadFile 文件上传,对应文件处理句柄类为:UploadFileClientHandler
deleteFile 删除服务端文件,对应文件处理句柄类为:DeleteFileClientHandler
replaceFile 替换服务端文件,对应文件处理句柄类为:ReplaceFileClientHandler
createThumbPicture 生成缩略图,对应文件处理句柄类为:CreateThumbPictureClientHandler
以上所有句柄类的父类均为UploadFileClientHandler,该类实现了一些共有方法,比如一些公共参数的包装等。
实现步骤以上传文件为例,其他类似实现。
直接上代码:
/** * 文件上传 * @param file 需要上传的文件 * @param fileName 文件名称 * @param thumbMark 是否需要生成缩略图 * @return * @author:landyChris */ public static String uploadFile(File file, String fileName, boolean thumbMark) { FileClientPipelineFactory clientPipelineFactory = new FileClientPipelineFactory(); //辅助类。用于帮助我们创建NETTY服务 ClientBootstrap bootstrap = createClientBootstrap(clientPipelineFactory); String strThumbMark = Constants.THUMB_MARK_NO; if (thumbMark) { strThumbMark = Constants.THUMB_MARK_YES; } //具体处理上传文件逻辑 uploadFile(bootstrap, FileClientContainer.getHost(), FileClientContainer.getPort(), file, fileName, strThumbMark, FileClientContainer.getUserName(), FileClientContainer.getPassword()); Result result = clientPipelineFactory.getResult(); if ((result != null) && (result.isCode())) { return result.getFilePath(); } return null; }
具有三个参数,前面几行代码都是很一些netty的初始化工作,具体看一个私有方法uploadFile,如下代码所示:
private static void uploadFile(ClientBootstrap bootstrap, String host, int port, File file, String fileName, String thumbMark, String userName, String pwd) { //1.构建uri对象 URI uri = getUri(host, port); //2.连接netty服务端 ChannelFuture future = bootstrap.connect(new InetSocketAddress(host, port)); //3.异步获取Channel对象 Channel channel = future.awaitUninterruptibly().getChannel(); if (!future.isSuccess()) { future.getCause().printStackTrace(); bootstrap.releaseExternalResources(); return; } //4.初始化文件上传句柄对象 WrapFileClientHandler handler = new UploadFileClientHandler(host, uri, file, fileName, thumbMark, userName, pwd); //5.获取Request对象 HttpRequest request = handler.getRequest(); //6.获取Http数据处理工厂 HttpDataFactory factory = getHttpDataFactory(); //7.进行数据的包装处理,主要是进行上传文件所需要的参数的设置,此时调用的句柄是具体的UploadFileClientHandler对象 HttpPostRequestEncoder bodyRequestEncoder = handler .wrapRequestData(factory); //8.把request写到管道中,传输给服务端 channel.write(request); //9.做一些关闭资源的动作 if (bodyRequestEncoder.isChunked()) { channel.write(bodyRequestEncoder).awaitUninterruptibly(); } bodyRequestEncoder.cleanFiles(); channel.getCloseFuture().awaitUninterruptibly(); bootstrap.releaseExternalResources(); factory.cleanAllHttpDatas(); }
主要有以下实现步骤:
构建uri对象
连接netty服务端
异步获取Channel对象
初始化文件上传句柄对象
获取Request对象
获取Http数据处理工厂
进行数据的包装处理,主要是进行上传文件所需要的参数的设置,此时调用的句柄是具体的UploadFileClientHandler对象
把request写到管道中,传输给服务端
做一些关闭资源的动作
具体细节实现请参考github上的代码。如果各位读者喜欢的话,可以加个star哈。
服务端组件实现功能也是跟客户端一致,具有以下功能:文件上传,文件替换,文件删除,如果是图片的话,还可以生成缩略图等功能。代码结构如下图所示:
org.lyx.file.server包是该组件的核心包。具体的处理句柄类有以下几个:
文件上传:UploadFileServerHandler
删除文件:DeleteFileServerHandler
替换文件:ReplaceFileServerHandler
生成缩略图:CreateThumbPictureServerHandler
以上所以句柄类的接口均为FileServerProcessor,并且继承了抽象类AbstractFileServerHandler。
具体实现步骤还是以文件上传为例。
首先org.lyx.file.server.support.FileServerHandler类会持续监听客户端的请求,如果是文件处理动作,则会进入messageReceived方法进行相应的处理逻辑。该类定义了以下成员变量:
//http请求 private HttpRequest request; //是否需要断点续传作业 private boolean readingChunks; //接收到的文件内容 private final StringBuffer responseContent = new StringBuffer(); //解析收到的文件 private static final HttpDataFactory factory = new DefaultHttpDataFactory(DefaultHttpDataFactory.MINSIZE); //16384L //post请求的解码类,它负责把字节解码成Http请求。 private HttpPostRequestDecoder decoder; //请求参数 private RequestParam requestParams = new RequestParam();
该方法实现中,如果文件大小小于chunked的最小值,则直接进行文件上传操作。否则,需要进行分块处理。然后进行文件上传操作。
文件大小小于1k的操作:
需要分块处理操作:
以上操作主要有两个注意点:
请求参数的解析工作(根据HttpDataType进行相应参数的赋值操作)
根据解析的参数进行相应的文件处理操作(根据文件操作类型,选择相应的处理句柄进行文件处理)
Netty网络应用框架和Mina类似,都封装了Socket。 Mina入门 长连接的基本概念 连接后一直与服务器保持长期连接 长连接的基本原理 底层都是基于TCP/IP协议 通过Socket,ServerSocket与服务器保持连接 服务端一般使用ServerSocket建立监听,监听客户端与之连接 客户端使用Socket,指定端口和IP地址,与服务端进行连接 长连接的意义 通过长连接,可以实现服
简介 在前面的章节中,我们讲解了kqueue的使用和原理,接下来我们再看一下epoll的使用。两者都是更加高级的IO方式,都需要借助native的方法实现,不同的是Kqueue用在mac系统中,而epoll用在liunx系统中。 epoll的详细使用 epoll的使用也很简单,我们还是以常用的聊天室为例来讲解epoll的使用。 对于server端来说需要创建bossGroup和workerGrou
by {@link ServerSocketChannel}, will return the {@link ServerSocketChannel} as its parent on {@link #parent()}. The semantics of the hierarchical structure depends on the transport implementation wher
简介 在前面的章节中,我们介绍了在netty中可以使用kequeue或者epoll来实现更为高效的native传输方式。那么kequeue和epoll和NIO传输协议有什么不同呢? 本章将会以kequeue为例进行深入探讨。 在上面我们介绍的native的例子中,关于kqueue的类有这样几个,分别是KQueueEventLoopGroup,KQueueServerSocketChannel和KQ
一.ProtoBuf 对象的序列化与反序列化 1.proto文件的定义 option java_package = "xss.netty.protobuf"; option java_outer_classname = "EmployeeModule"; message Employee{ required int64 emploee_id = 1; required string fir
本文向大家介绍javaweb实现文件上传与下载功能,包括了javaweb实现文件上传与下载功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了javaweb文件的上传与下载,供大家参考,具体内容如下 一、文件上传 要实现Web开发的上传功能,通常需要完成两步操作:一是在Web页面中添加上传输入项;二是在Servlet中读取上传文件的数据,并保存到本地硬盘中。 上传大多数情况是通过表单
本文向大家介绍springboot实现文件上传和下载功能,包括了springboot实现文件上传和下载功能的使用技巧和注意事项,需要的朋友参考一下 spring boot 引入”约定大于配置“的概念,实现自动配置,节约了开发人员的开发成本,并且凭借其微服务架构的方式和较少的配置,一出来就占据大片开发人员的芳心。大部分的配置从开发人员可见变成了相对透明了,要想进一步熟悉还需要关注源码。 1.文件上传
本文向大家介绍spring mvc实现文件上传与下载功能,包括了spring mvc实现文件上传与下载功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了spring mvc实现文件上传与下载功能的具体代码,供大家参考,具体内容如下 文件上传 在pom.xml中引入spring mvc以及commons-fileupload的相关jar 在springmvc.xml中加入文件上传的相
本文向大家介绍SpringBoot实现文件上传下载功能小结,包括了SpringBoot实现文件上传下载功能小结的使用技巧和注意事项,需要的朋友参考一下 最近做的一个项目涉及到文件上传与下载。前端上传采用百度webUploader插件。有关该插件的使用方法还在研究中,日后整理再记录。本文主要介绍SpringBoot后台对文件上传与下载的处理。 单文件上传 如果想要修改文件路径及文件名,修改fileP
本文向大家介绍java文件上传下载功能实现代码,包括了java文件上传下载功能实现代码的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了文件上传下载java实现代码,供大家参考,具体内容如下 前台: 1. 提交方式:post 2. 表单中有文件上传的表单项: <input type=”file” /> 3. 指定表单类型: 默认类型:enctype="application/x
本文向大家介绍Retrofit+Rxjava实现文件上传和下载功能,包括了Retrofit+Rxjava实现文件上传和下载功能的使用技巧和注意事项,需要的朋友参考一下 Retrofit简介: 在Android API4.4之后,Google官方使用了square公司推出的okHttp替换了HttpClient的请求方式。后来square公司又推出了基于okHttp的网络请求框架:Retrofit。