美文网首页
一、netty构建http服务器

一、netty构建http服务器

作者: 邪恶泰迪 | 来源:发表于2019-05-20 23:31 被阅读0次

    netty可以作为http的服务器,处理客户端的请求和响应,但是netty并没有遵循servlet规范,和我们平时使用的web层框架struts2、springmvc等框架底层是有所区别的。netty构建的服务不需要部署在像tomcat容器中,可以单独使用。netty是一个底层的技术框架,对于请求路由没有提供任何的支持。

    maven依赖

    <dependency>    
        <groupId>io.netty</groupId>
        <artifactId>netty-all</artifactId>
        <version>4.1.16.Final</version>
    </dependency>
    

    http服务端

    public class TestServer {
        public static void main(String[] args) throws InterruptedException {
    
            //定义两个基于NIO的事件循环组,死循环,不断的接收客户端的连接
            //bossGroup:不断的从客户端接收连接,但是不对连接做任何处理,转给workGroup
            //workGroup:对连接进行真正的处理
            EventLoopGroup bossGroup = new NioEventLoopGroup();
            EventLoopGroup workGroup = new NioEventLoopGroup();
    
            try {
                //服务端启动类,对启动做了一定的封装
                ServerBootstrap serverBootstrap = new ServerBootstrap();
                //NioServerSocketChannel 反射方式创建
                serverBootstrap.group(bossGroup,workGroup).channel(NioServerSocketChannel.class)
                        .childHandler(new TestServerInitializer());
    
                ChannelFuture channelFuture = serverBootstrap.bind(8888).sync();
                channelFuture.channel().closeFuture().sync();
    
            }finally {
                bossGroup.shutdownGracefully();
                workGroup.shutdownGracefully();
            }
        }
    }
    
    ChannelInitializer

    作用:用于在某个Channel注册到EventLoop后,对这个Channel执行一些初始化操作。ChannelInitializer虽然会在一开始会被注册到Channel相关的pipeline里,但是在初始化完成之后,ChannelInitializer会将自己从pipeline中移除,不会影响后续的操作。

    //服务端的初始化器
    public class TestServerInitializer extends ChannelInitializer<SocketChannel> {
        //连接一旦被注册之后就会被创建,执行initChannel回调的方法
        @Override
        protected void initChannel(SocketChannel ch) throws Exception {
            //管道
            ChannelPipeline pipeline = ch.pipeline();
    
            //HttpServerCodec TestHttpServerHandler 多实例对象
            pipeline.addLast("httpServerCodec",new HttpServerCodec());
    
            pipeline.addLast("testHttpServerHandler",new TestHttpServerHandler());
        }
    }
    

    自定义处理器,里面是服务器端的处理逻辑

    //自定义处理器
    public class TestHttpServerHandler extends SimpleChannelInboundHandler<HttpObject> {
        //读取客户端的请求并向客户端返回响应的方法
        @Override
        protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception {
    
            ByteBuf content = Unpooled.copiedBuffer("Hello World",CharsetUtil.UTF_8);
    
            //http响应
            FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1,
                    HttpResponseStatus.OK,content);
            response.headers().set(HttpHeaderNames.CONTENT_TYPE,"text/plain");
            response.headers().set(HttpHeaderNames.CONTENT_LENGTH,content.readableBytes());
    
            //返回客户端
            ctx.writeAndFlush(response);
        }
    }
    

    测试

    启动服务端,浏览器输入:http://localhost:8888,可以看见返回 hello world .

    image.png

    相关文章

      网友评论

          本文标题:一、netty构建http服务器

          本文链接:https://www.haomeiwen.com/subject/lpjrzqtx.html