• Netty构建Http服务器


      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 ,结果如下:

  • 相关阅读:
    JS——jquery UI
    js——正则表达式
    jsonp——使用公共接口获取数据
    JS——json、ajax、jsonp
    [HNOI2011]括号修复 / [JSOI2011]括号序列
    [HNOI 2016] 树
    luogu_P3313 [SDOI2014]旅行
    无旋Treap模板
    [CF 718C] Sasha and Array
    [洛谷 P4556] 雨天的尾巴
  • 原文地址:https://www.cnblogs.com/hhhshct/p/8580354.html
Copyright © 2020-2023  润新知