Netty实现类似Http File Server文件传输功能

Posted IT界一虫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Netty实现类似Http File Server文件传输功能相关的知识,希望对你有一定的参考价值。


当前浏览器不支持播放音乐或语音,请在微信或其他浏览器中播放 Netty实现类似Http File Server文件传输功能         ——我们每个人都应该感谢这个时代的伟大

 

Netty框架在我平时的工作中其实并没有用到,前几天想做一个局域网内由Windows系统向Linux系统传输文件的小工具,发现Netty能完美的解决我的需求,于是便了解了一下Netty框架。以下是来自百度百科对Netty的描述。Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。也就是说,Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty相当简化和流线化了网络应用的编程开发过程,例如,TCP和UDP的socket服务开发。“快速”和“简单”并不用产生维护性或性能上的问题。Netty 是一个吸收了多种协议的实现经验,这些协议包括FTP,SMTP,HTTP,各种二进制,文本协议,并经过相当精心设计的项目,最终,Netty 成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性。

http文件服务器类代码

public class HttpFileServer {

public void start(String localDir){

EventLoopGroup acceptorGroup = new NioEventLoopGroup();

EventLoopGroup clientGroup = new NioEventLoopGroup();

ServerBootstrap serverBootstrap = new ServerBootstrap();

serverBootstrap.group(acceptorGroup, clientGroup).channel(NioserverSocketChannel.class).option(ChannelOption.SO_BACKLOG,100)

.childHandler(new ChannelInitializer<SocketChannel>() {

protected void initChannel(SocketChannel sc){

sc.pipeline().addLast("http-decoder", new HttpRequestDecoder());

sc.pipeline().addLast("http-aggregator", new HttpObjectAggregator(64 * 1024));

sc.pipeline().addLast("http-encoder", new HttpResponseEncoder());

sc.pipeline().addLast("http-handler", new HttpRequestHandle(localDir));

}

});

ChannelFuture channelFuture;

try {

channelFuture = serverBootstrap.bind(8080).sync();

channelFuture.channel().closeFuture().sync();

} catch (InterruptedException e) {

e.printStackTrace();

}finally{

acceptorGroup.shutdownGracefully();

clientGroup.shutdownGracefully();

}

}

}

public class HttpRequestHandle extends SimpleChannelInboundHandler<FullHttpRequest>{

private String localDir;

public HttpRequestHandle(String localDir){

this.localDir = localDir;

}

public static final HttpVersion HTTP_1_1 = new HttpVersion("HTTP",1,1,true);

@Override

protected void messageReceived(ChannelHandlerContext paramChannelHandlerContext, FullHttpRequest paramI)

throws Exception {

String uri = paramI.uri();

uri = URLDecoder.decode(uri,"utf-8");

String filePath = localDir+uri;

File file = new File(filePath);

if(file.isFile()){

sendFileToClient(paramChannelHandlerContext,file);

return ;

}

paramChannelHandlerContext.close();

}

 

/**

* 发送文件到客户端

*/

private void sendFileToClient(ChannelHandlerContext ctx, File file){

try {

ByteBuf buffer = Unpooled.copiedBuffer(Files.readAllBytes(file.toPath()));

FullHttpResponse resp = new DefaultFullHttpResponse(HTTP_1_1,HttpResponseStatus.OK,buffer);

MimetypesFileTypeMap mimeTypeMap = new MimetypesFileTypeMap();

resp.headers().set(HttpHeaderNames.CONTENT_TYPE,mimeTypeMap.getContentType(file));

ctx.writeAndFlush(resp).addListener(ChannelFutureListener.CLOSE);

} catch (IOException e) {

e.printStackTrace();

}

}

public String getLocalDir() {

return localDir;

}

public void setLocalDir(String localDir) {

this.localDir = localDir;

}

}



以上是关于Netty实现类似Http File Server文件传输功能的主要内容,如果未能解决你的问题,请参考以下文章

使用 Netty 写一个 HTTP Server

Netty 长连接 Server 主动推送功能实现及问题

基于netty的文件上传下载组件

4.socket框架netty的使用,以及nio的实现原理,为啥是异步非阻塞

Netty整合SpringMVC,实现高效的HTTP服务请求

Java进阶:Netty实现RPC的代码