一、netty构建http服务器

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

maven依赖

    
    io.netty
    netty-all
    4.1.16.Final

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 {
    //连接一旦被注册之后就会被创建,执行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 {
    //读取客户端的请求并向客户端返回响应的方法
    @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服务器)