Netty 是一个基于 JAVA NIO 类库的异步通信框架,它的架构特点是:异步非阻塞、基于事件驱动、高性能、高可靠性和高可定制性。换句话说,Netty是一个NIO框架,使用它可以简单快速地开发网络应用程序,比如客户端和服务端的协议。Netty大大简化了网络程序的开发过程比如TCP和UDP的 Socket的开发。Netty 已逐渐成为 Java NIO 编程的首选框架,Netty中,通讯的双方建立连接后,会把数据按照ByteBuf的方式进行传输,因此我们在构建Http服务器的时候就是通过HttpRequestDecoder对ByteBuf数据流进行处理,转换成http的对象。代码如下:
maven依赖
<dependency> ?????<groupId>io.netty</groupId> ?????<artifactId>netty-all</artifactId> ?????<version>4.1.0.Final</version> ?</dependency>
HttpServer类
package com.example.demo.netty;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.channel.ChannelPipeline;import io.netty.channel.EventLoopGroup;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.SocketChannel;import io.netty.channel.socket.nio.NioServerSocketChannel;import io.netty.handler.codec.http.HttpServerCodec;public class HttpServer { ???public static void main(String[] args) throws InterruptedException { ???????EventLoopGroup bossGroup = new NioEventLoopGroup(); ???????EventLoopGroup workerGroup = new NioEventLoopGroup(); ???????try { ???????????ServerBootstrap b = new ServerBootstrap(); ???????????b.group(bossGroup, workerGroup) ???????????????????.channel(NioServerSocketChannel.class) ???????????????????.childHandler(new ChannelInitializer<SocketChannel>() { ???????????????????????@Override ???????????????????????public void initChannel(SocketChannel ch) throws Exception { ???????????????????????????ChannelPipeline pipeline = ch.pipeline(); ???????????????????????????pipeline.addLast(new HttpServerCodec()); ???????????????????????????pipeline.addLast(new HttpServerHandler()); ???????????????????????} ???????????????????}); ???????????ChannelFuture f = b.bind(8080).sync(); ???????????f.channel().closeFuture().sync(); ???????} finally { ???????????workerGroup.shutdownGracefully(); ???????????bossGroup.shutdownGracefully(); ???????} ???}}
HttpServerHandler类
package com.example.demo.netty;import java.io.UnsupportedEncodingException;import io.netty.buffer.Unpooled;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.ChannelInboundHandlerAdapter;import io.netty.handler.codec.http.DefaultFullHttpResponse;import io.netty.handler.codec.http.FullHttpResponse;import io.netty.handler.codec.http.HttpRequest;import io.netty.handler.codec.http.HttpResponseStatus;import io.netty.handler.codec.http.HttpVersion;import io.netty.handler.codec.http.QueryStringDecoder;class HttpServerHandler extends ChannelInboundHandlerAdapter { ???@Override ???public void channelRead(ChannelHandlerContext ctx, Object msg) throws UnsupportedEncodingException { ???????if (msg instanceof HttpRequest) { ???????????// 请求,解码器将请求转换成HttpRequest对象 ???????????HttpRequest request = (HttpRequest) msg; ???????????????????????// 获取请求参数 ???????????QueryStringDecoder queryStringDecoder = new QueryStringDecoder(request.uri()); ???????????String name = "netty"; ???????????if(queryStringDecoder.parameters().get("name") != null) { ???????????????????name = queryStringDecoder.parameters().get("name").get(0); ???????????} ???????????// 响应HTML ???????????String responseHtml = "<html><body>Hello, " + name + "</body></html>"; ???????????byte[] responseBytes = responseHtml.getBytes("UTF-8"); ???????????int contentLength = responseBytes.length; ???????????// 构造FullHttpResponse对象,FullHttpResponse包含message body ???????????FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, Unpooled.wrappedBuffer(responseBytes)); ???????????response.headers().set("Content-Type", "text/html; charset=utf-8"); ???????????response.headers().set("Content-Length", Integer.toString(contentLength)); ???????????ctx.writeAndFlush(response); ???????} ???} ???@Override ???public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { ???????cause.printStackTrace(); ???????ctx.close(); ???}}
运行HttpServer中main方法,启动httpServer,打开浏览器输入http://localhost:8080?name=zhangsan ,结果如下:
Netty构建Http服务器
原文地址:https://www.cnblogs.com/hhhshct/p/8580354.html