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 .
网友评论