一、Netty是什么
Netty是一个高性能、异步的NIO框架,基于Java NIO的特性进行封装。它的出现,使得基于NIO的开发变得更加简单,同时提高了性能和可靠性。在我们学习Netty之前,推荐阅读以下两本书籍:
二、《Netty权威指南》
《Netty权威指南》通俗易懂,适合入门学习。这本书旨在为使用Netty框架的开发人员提供一个全面的、深入的指南,涵盖了网络协议、异步编程和Netty API的所有方面。这本书分为七个部分,其中包括:Netty的架构和工作原理、Netty的基本组件和功能、网络协议的实现、数据处理、安全性、优化和扩展。下面是一个简单的Netty服务端的示例:
public class NettyServer {
public static void main(String[] args) throws InterruptedException {
NioEventLoopGroup bossGroup = new NioEventLoopGroup(1);
NioEventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 128)
.childOption(ChannelOption.SO_KEEPALIVE, true)
.childHandler(new ChannelInitializer() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new StringDecoder());
pipeline.addLast(new StringEncoder());
pipeline.addLast(new NettyServerHandler());
}
});
ChannelFuture channelFuture = serverBootstrap.bind(6668).sync();
channelFuture.channel().closeFuture().sync();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
}
class NettyServerHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
System.out.println((String) msg);
ctx.writeAndFlush("服务端已接收到消息");
}
}
三、《深入分析Java Web技术内幕》
《深入分析Java Web技术内幕》是一本从Java基础知识到实际应用场景的详细阐述之书。在里面,关于Netty的介绍并不是非常详细,但是对于理解网络原理和协议处理有着重要的帮助。如果你在使用Netty过程中,遇到了一些网络协议的问题,这本书会给你提供新的思路。下面是一个简单的HTTP服务端的示例:
public class HttpServer {
public static void main(String[] args) throws InterruptedException {
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap serverBootstrap = new ServerBootstrap()
.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new HttpServerCodec());
pipeline.addLast(new HttpObjectAggregator(1024 * 1024));
pipeline.addLast(new HttpServerHandler());
}
});
ChannelFuture channelFuture = serverBootstrap.bind(8888).sync();
channelFuture.channel().closeFuture().sync();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
}
class HttpServerHandler extends SimpleChannelInboundHandler {
@Override
protected void channelRead0(ChannelHandlerContext ctx, FullHttpRequest msg) throws Exception {
System.out.println(msg.toString());
ByteBuf content = Unpooled.copiedBuffer("服务端已接收到消息", CharsetUtil.UTF_8);
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);
}
}
四、《Netty实战》
《Netty实战》是一个循序渐进的指南,适合开发人员逐步掌握Netty框架,并在实际应用中使用。该书覆盖了Netty网络编程的所有不同方面,包括:使用ByteBuf进行编解码、使用ChannelHandler实现协议处理、使用EventLoop执行异步I/O操作以及使用Netty构建客户端和服务端。下面是一个简单的Netty客户端的示例:
public class NettyClient {
public static void main(String[] args) throws Exception {
EventLoopGroup group = new NioEventLoopGroup();
try {
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(group)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new StringDecoder());
pipeline.addLast(new StringEncoder());
pipeline.addLast(new NettyClientHandler());
}
});
ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", 6668).sync();
channelFuture.channel().closeFuture().sync();
} finally {
group.shutdownGracefully();
}
}
}
class NettyClientHandler extends SimpleChannelInboundHandler {
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
ctx.writeAndFlush("客户端发送消息");
}
@Override
protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
System.out.println(msg);
}
}
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/185622.html
微信扫一扫
支付宝扫一扫