更新时间:2022-07-03 19:48:06
本章介绍
本章将简单介绍Netty的核心概念这个狠心概念就是学习Netty是如何拦截和处理异常对于刚开始学习netty的读者利用netty的异常拦截机制来调试程序问题很有帮助。本章还会介绍其他一些核心概念如服务器和客户端的启动以及分离通道的处理程序。本章学习一些基础以便后面章节的深入学习。本章中将编写一个基于netty的服务器和客户端来互相通信我们首先来设置netty的开发环境。
《Netty In Action》中描述的比较多没啥用这里就不多说了。本系列博客将使用Netty4需要JDK1.7+
从上图中可以看出服务器会写数据到客户端并且处理多个客户端的并发连接。从理论上来说限制程序性能的因素只有系统资源和JVM。为了方便理解这里举了个生活例子在山谷或高山上大声喊你会听见回声回声是山返回的在这个例子中你是客户端山是服务器。喊的行为就类似于一个Netty客户端将数据发送到服务器听到回声就类似于服务器将相同的数据返回给你你离开山谷就断开了连接但是你可以返回进行重连服务器并且可以发送更多的数据。
虽然将相同的数据返回给客户端不是一个典型的例子但是客户端和服务器之间数据的来来回回的传输和这个例子是一样的。本章的例子会证明这一点它们会越来越复杂。
接下来的几节将带着你完成基于Netty的客户端和服务器的应答程序。
写一个Netty服务器主要由两部分组成
通过创建ServerBootstrap对象来启动服务器然后配置这个对象的相关选项如端口、线程模式、事件循环并且添加逻辑处理程序用来处理业务逻辑(下面是个简单的应答服务器例子)
从上面这个简单的服务器例子可以看出启动服务器应先创建一个ServerBootstrap对象因为使用NIO所以指定NioEventLoopGroup来接受和处理新连接指定通道类型为NioServerSocketChannel设置InetSocketAddress让服务器监听某个端口已等待客户端连接。
接下来调用childHandler放来指定连接后调用的ChannelHandler这个方法传ChannelInitializer类型的参数ChannelInitializer是个抽象类所以需要实现initChannel方法这个方法就是用来设置ChannelHandler。
最后绑定服务器等待直到绑定完成调用sync()方法会阻塞直到服务器完成绑定然后服务器等待通道关闭因为使用sync()所以关闭操作也会被阻塞。现在你可以关闭EventLoopGroup和释放所有资源包括创建的线程。
这个例子中使用NIO因为它是目前最常用的传输方式你可能会使用NIO很长时间但是你可以选择不同的传输实现。例如这个例子使用OIO方式传输你需要指定OioServerSocketChannel。Netty框架中实现了多重传输方式将再后面讲述。
本小节重点内容
Netty使用futures和回调概念它的设计允许你处理不同的事件类型更详细的介绍将再后面章节讲述但是我们可以接收数据。你的channel handler必须继承ChannelInboundHandlerAdapter并且重写channelRead方法这个方法在任何时候都会被调用来接收数据在这个例子中接收的是字节。
下面是handler的实现其实现的功能是将客户端发给服务器的数据返回给客户端
Netty使用多个Channel Handler来达到对事件处理的分离因为可以很容的添加、更新、删除业务逻辑处理handler。Handler很简单它的每个方法都可以被重写它的所有的方法中只有channelRead方法是必须要重写的。
创建启动一个客户端包含下面几步
实现代码如下
可能你会问为什么在这里使用的是SimpleChannelInboundHandler而不使用ChannelInboundHandlerAdapter主要原因是ChannelInboundHandlerAdapter在处理完消息后需要负责释放资源。在这里将调用ByteBuf.release()来释放资源。SimpleChannelInboundHandler会在完成channelRead0后释放消息这是通过Netty处理所有消息的ChannelHandler实现了ReferenceCounted接口达到的。
客户端的编写完了下面让我们来测试一下
注意netty4需要jdk1.7+。
本人测试可以正常运行。
本章介绍了如何编写一个简单的基于Netty的服务器和客户端并进行通信发送数据。介绍了如何创建服务器和客户端以及Netty的异常处理机制。
原文地址http://www.bieryun.com/2148.html