首页
随机
最近更改
特殊页面
社群首页
参数设置
关于WHY42
免责声明
WHY42
搜索
用户菜单
登录
欢迎来到Riguz的小站!这是一个私人wiki,用来记录一些我的笔记。
查看“︁Netty introduction”︁的源代码
←
Netty introduction
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
Netty是一个高性能的异步事件驱动的网络应用框架,本质上是对NIO进行了高层的抽象,使得可以轻松的创建服务器和客户端,极大简化了诸如TCP和UDP套接字的操作。 = 入门= == 核心概念== [[File:Netty-architecture.png|600px|Netty Architecture]] Netty中的一些核心概念: ;Channel:对应到Socket ;EventLoop:用来控制流、多线程处理以及并发 ;ChannelFuture:用来实现异步通知 == ECHO server== 最简单的例子是构建一个echo server,发过来什么同样返回什么。 首先需要实现一个Handler,定义如何处理消息: <syntaxhighlight lang="java"> public class EchoServerHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { // handler需要去释放msg对象(引用计数) // 这里不用去手动release msg,因为writeAndFlush里面已经处理了 ctx.writeAndFlush(msg); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { cause.printStackTrace(); ctx.close(); } } </syntaxhighlight> 然后利用<span class="article-label">ServiceBootStrap</span>来启动 <syntaxhighlight lang="java"> public class EchoServer { private final int port; public EchoServer(int port) { this.port = port; } public void run() throws InterruptedException { EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new EchoServerHandler()); } }) .option(ChannelOption.SO_BACKLOG, 128) .childOption(ChannelOption.SO_KEEPALIVE, true); ChannelFuture f = bootstrap.bind(port).sync(); f.channel().closeFuture().sync(); } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); } } public static void main(String[] args) throws InterruptedException { new EchoServer(9999).run(); } } </syntaxhighlight> = 基本原理= == EventLoop与Server Channel、Channel== 其运行原理如图: * 左边只有一个ServerChannel,代表服务器上监听某个端口的套接字,所以实际上也只需要一个EventLoop就可以了 * 右边代表建立的客户端连接,每一个连接都对应到一个EventLoop,当有很多个连接的时候,这些连接是会共享其中的EventLoop的。 == ChannelPipeline== 每次建立连接的时候,都会调用<span class="article-label">ChannelInitializer</span>,这个类负责安装一些自定义的<span class="article-label">ChannelHandler</span>到<span class="article-label">ChannelPipeline</span>中。 实际上的程序可能对应到多个入站和出站的ChannelHandler,它们的执行顺序是由它们被添加的顺序所决定的,类似这样: == ChannelHandler== ChanelHandler又有很多的类型,比如: * 编码器和解码器, 例如<span class="article-label">ByteToMessageDecoder</span>、<span class="article-label">ProtobufEncoder</span>等 * <syntaxhighlight lang="java" inline>SimpleChannelInboundHandler<T></syntaxhighlight>,用来处理简单的逻辑比如收到消息后完成业务逻辑,只需要实现其中的<syntaxhighlight lang="java" inline>void channelRead0(ChannelHandlerContext ctx, I msg)</syntaxhighlight>方法即可 == Bootstrap== 前面使用ServerBootstrap类来启动了服务器上的socket监听,如果是客户端程序可以使用Bootstrap类来完成。一个比较明显的区别就是,客户端程序只需要一个EventLoopGroup而服务端通常会需要两个。 Ref: * [https://netty.io/wiki/user-guide-for-4.x.html Netty User guide for 4.x] * [https://livebook.manning.com/book/netty-in-action Netty in Action] [[Category:Netty]]
返回
Netty introduction
。