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(),我们就利用这个做文章就可以了

发表评论

邮箱地址不会被公开。 必填项已用*标注