Netty为了很多通用协议提供了预置编解码器
我们看下这些预置处理器
通过SSL 和 TLS进行Netty的应用程序保护
我们可能遇到SSL和TLS这样常见的安全协议,我们也需要支持SSL和TLS,提供了javax.net.ssl包
对应的SSLContext和SSLEngine类使得解密和加密相当直接了当,Netty内部还提供了一个SslHandler的ChannelHandler来实现这个API,SslHandler在内部SSLEngine来完成实际工作
Netty还有OpenSSL工具包,内部也有SSLEngine实现,这个Netty的SSLEngine性能更好,也是Netty的默认实现
我们展示一下代码
如何去将SslHandler添加到ChannelPipeline中
这里利用的是ChannelInitializer
SslHandler被加载到了第一个ChannelHandler
SslHandler内置了很多商议相关的方法,方便在握手的阶段,两个节点相互验证并且商定一个加密的方式,在SslHandler装载的时候可以进行指定
然后是Netty提供的Http和Https的应用程序
这是常见的协议套件
Netty提供了对应的ChannelHandler
HTTP基于的是请求/响应,客户端向服务器发起一个http请求,然后服务其返回对应响应
对应的ChannelHandler也有着不小的数量
一个HTTP请求包含多个数据部分
在Java中HTTP消息格式,是实现了HTTPObject接口的
而HTTP的格式中
往往包含了HttpRequest头 http文本 和一个表明该请求结束的LastHttpContent
在对应的Netty框架中,包含了解析如上信息的
HttpRequestEncoder
HttpRequestDecoder
分别将消息编码为字节和将字节编码为消息
对应响应,还有编解码器
HttpResponseEncoder
HttpResponseDecoder
对于HTTP的支持,很简单,只需要利用一个Initializer进行添加就行
我们下面就是一个简单的引导类
在我们安装完了对应的相应处理之后,我们需要处理不同类型的HttpObject
由于Http的请求或者响应可能由许多部分组成,所以,需要进行消息的聚合,合并为完整的消息
Netty提供了对应的处理器,方便我们进行聚合,直接合并为FullHttpRequest或者FullHttpResponse
这样,我们就不必关心消息碎片了
而合格机制,只需要在引导器中再一次添加一个处理器即可
对于HTTP,可以进行开启压缩功能从而减少传输数据的大小
Netty为HTTP的解压缩提供了对应的ChannelHandler的实现,支持gzip和deflate编码
HTTP的客户端可以在请求头里说明他支持何种压缩格式
但是服务器端并不一定会发送压缩数据
对于添加这一样
我们可以直接在客户端和服务器端引导的时候添加处理器即可
对于HTTPS的使用
我们只需要将SslHandler也添加上去,就可以了
这样,就显示了Netty的良好架构,需要额外的功能,直接添加到ChannelPipeline中即可
然后是一个额外的协议
WebSocket
这是一种2011年就标准化的协议
其提供了一种更加有效的解决方案,在一个单个的TCP连接上提供双向的通信
而Netty对于支持WebSocket,分别开发了客户端和服务器端的ChannelHandler
利用这个Handler,我们就可以处理由WebSocket定义的帧的消息格式
在WebSocket交互过程中呢,使用的交互数据格式被称为WebSocektFrame
常见的WebSocketFrame类型有
BinaryWebSocketFrame 二进制
TextWebSocketFrame 文本数据
ContinuationWebSocketFrame 属于上一个Frame的数据
CloseWebSocketFrame 关闭请求
PingWebScoketFrame 请求一个PongWebSocketFrame
PongWebSocketFrame 对于PingWebSocketFrame的相应
我们主要展示下一个简单的WebSocketChannelHandler的示例
以及简单对于控制帧处理方式
对于具体的TextFrameHandler
BinaryFrameHandler
ContinuationFrameHandler 只需要继承SimpleChannelInboundHandler并声明入参为对应的Frame
对于空闲连接的管理
则也有着对应的ChannelHandler
常见的处理器如下
对于一个IdleStateHandler处理的实现,我们可以如下的看
对应的Handler实现
我们连接超过60秒没有收到或者发送任何数据,那么IdleStateHandler会使用一个IdleStateEvnet来触发fireUserEventTriggered(),我们就利用这个做文章就可以了