1 Netty简介
Netty是基于Java NIO的网络应用框架.
Netty是一个NIO client-server(客户端服务器)框架,使用Netty可以快速开发网络应用,例如服务器和客户端协议。Netty提供了一种新的方式来使开发网络应用程序,这种新的方式使得它很容易使用和有很强的扩展性。Netty的内部实现时很复杂的,但是Netty提供了简单易用的api从网络处理代码中解耦业务逻辑。Netty是完全基于NIO实现的,所以整个Netty都是异步的。
网络应用程序通常需要有较高的可扩展性,无论是Netty还是其他的基于Java NIO的框架,都会提供可扩展性的解决方案。Netty中一个关键组成部分是它的异步特性.
2 最简单的API用法
2.1 引入jar包
|
|
2.2 代码实现
Netty客户端
|
|
|
|
Netty服务端
|
|
|
|
- 启动服务端
- 启动客户端
服务端显示
|
|
客户端显示
|
|
3 Netty中的Handler
3.1 简介
Handler在netty中,无疑占据着非常重要的地位。
Handler与Servlet中的filter很像,通过Handler可以完成通讯报文的解码编码、拦截指定的报文、统一对日志错误进行处理、统一对请求进行计数、控制Handler执行与否。
Netty中的所有handler都实现自ChannelHandler接口。按照输入输出来分,分为ChannelInboundHandler、ChannelOutboundHandler两大类。
ChannelInboundHandler对从客户端发往服务器的报文进行处理,一般用来执行解码、读取客户端数据、进行业务处理等;ChannelOutboundHandler对从服务器发往客户端的报文进行处理,一般用来进行编码、发送报文到客户端。
Netty中,可以注册多个handler。ChannelInboundHandler按照注册的先后顺序执行;ChannelOutboundHandler按照注册的先后顺序逆序执行,
如下图所示,按照注册的先后顺序对Handler进行排序,request进入Netty后的执行顺序为:
示例代码
|
|
|
|
|
|
|
|
|
|
3.2 小结
在使用Handler的过程中,需要注意:
- 1、ChannelInboundHandler之间的传递,通过调用 ctx.fireChannelRead(msg) 实现;调用ctx.write(msg) 将传递到ChannelOutboundHandler。
- 2、ctx.write()方法执行后,需要调用flush()方法才能令它立即执行。
- 3、流水线pipeline中outhandler不能放在最后,否则不生效
- 4、Handler的消费处理放在最后一个处理。
4 Netty发送对象
Netty中,通讯的双方建立连接后,会把数据按照ByteBuf的方式进行传输,例如http协议中,就是通过HttpRequestDecoder对ByteBuf数据流进行处理,转换成http的对象。基于这个思路,我自定义一种通讯协议:Server和客户端直接传输java对象。
实现的原理是通过Encoder把java对象转换成ByteBuf流进行传输,通过Decoder把ByteBuf转换成java对象进行处理,处理逻辑如下图所示:
客户端部分代码
|
|
|
|
|
|
服务端部分代码
|
|
|
|
|
|