首选设置好了JDK和Maven两个工具
这一章节,我们主要是了解netty的API
对于编写Netty服务器,我们需要一个ChannelHandler,这个组件实现了从服务器到客户端接收数据的处理,也就是业务逻辑
然后是配置服务器的启动代码
关于ChannelHandler,负责接收并响应事件的通知
在本次中,我们需要实现ChannelInbound实现,响应入站的事件,而我们需要处理的事件并不多,所以我们继承了ChannelInboundHandlerAdapter类,内置了ChannelInboundHandler的默认实现
我们需要实现方法
channelRead(),对于传入的消息处理
channelReadComplete(),通知ChannelInboundHandler最后一次调用了
exceptionCaught 读取时候有异常会被调用
我们的代码实现如下
我们重写部分的方法挂载到是事件的声明周期上,对于所有处理方法,利用重写了channelRead(),所以直接在代码中返回给了远程节点
重写了exceptionCaught
来保证捕获异常,再有了异常的时候,我们进行了连接的关闭
如果不捕获异,可能会一直沿着ChannelHandler的实例链,一直到末端
对于客户端的编写,我们需要注意的点有
针对不同的类型事件来驱动ChannelHandler
接下来我们尝试绑定端口,并启动服务
代码如下
首先创建了一个ServerBootstrap的实例,因为是NIO,所以指定了NioEventLoopGroup来接收管理新的连接
Channel则指定了NioServerSocketChannel
然后设定了本地端口
最后指定了channelInitializer,表明一个新的连接创建的时候,一个子Channel也会被创建
这个Initializer会创建一个对应的Handler加到Channel
然后这个程序阻塞等待直到服务器关闭,然后在final中关闭了EventLoop,释放了所有资源
我们使用了NIO完成了上述代码
我们在上述代码中
利用EchoServerHadnler实现了业务逻辑
创建了一个ServerBootstrap引导绑定服务器
创建一个Group来进行事件的处理
指定服务绑定本地的InetSocketAddress
使用一个Init来分配Channel
调用bind来绑定服务器
对于客户端来说,我们要实现的功能有
连接服务器
发送一个或者多个消息
对于每个消息,等待消息返回
关闭连接
客户端也会有一个对应的处理数据的ChannelHandler这一点,我们可以扩展SimpleChannelInbouldHandler
然后,需要处理一下方法
channelActuve,连接建立后调用
channelRead0(),从服务器接收到一条消息时被调用
exceptionCaught.处理过程中出现异常
我们在连接建立成功的时候
利用channelActive,向服务器发送了字符串 Netty rocks
然后是channelRead(),每当接收数据的时候,都会调用,里面用ByteBuf保证了接收
然后是exceptionCaught,用来捕获异常,用于关闭Channel,终止服务器的了解
关于上述继承的不同适配器 SimpleChannelInboundHandler 和 ChannelInboundHandler
是关于消息处理的不同方式
在客户端上,channelRead0()方法已经完成的时候,已经有了传入消息,SImpleChannelInboundHadnler会释放指向保存该消息的ByteBuf的内存引用
ChannelInboundHandler则会一直保存到返回消息的时候释放
在客户端上,不需要固定一个端口用于发送消息,所以我们只需要声明服务器端的端口信息
所以我们创建了一个Bootstrap实例
以及为事件分配分配了一个NioEventLoopGroup实例,其中包括创建新的连接和处理出入站的数据
为服务器连接创建了一个InetSocketAddress实例
连接被建立的时候一个EchoClientHandler会被安装到ChannelPipeline中
一切都完成后,调用Bootstrap.connect来进行远程的连接