Netty如何传输文件

Posted

tags:

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

参考技术A 首先发送端将file包装成filereigon传输,其内部会循环的将文件发送到接收端
而接收端接收到的都是bytebuf,然后我们接收端可以将其写到filechannel中。这样在接收端就可以写成文件了,从这样看我们的内存也不会因为传输的文件大而爆掉。因为我们底层是依靠transferTo的transferTo去循环发送文件数据

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如何传输文件的主要内容,如果未能解决你的问题,请参考以下文章

Netty 4.0 SPDY 文件传输不工作

Netty网络编程实战3,使用Netty远程传输文件

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

netty 传输数据为啥要序列化

厉害了,Netty 轻松实现文件上传!

厉害了,Netty 轻松实现文件上传!