Netty如何传输文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Netty如何传输文件相关的知识,希望对你有一定的参考价值。
参考技术A 首先发送端将file包装成filereigon传输,其内部会循环的将文件发送到接收端而接收端接收到的都是bytebuf,然后我们接收端可以将其写到filechannel中。这样在接收端就可以写成文件了,从这样看我们的内存也不会因为传输的文件大而爆掉。因为我们底层是依靠transferTo的transferTo去循环发送文件数据
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如何传输文件的主要内容,如果未能解决你的问题,请参考以下文章