Netty4.x中文教程系列(五)编解码器Codec

上一篇文章详细解释了ChannelHandler的相关构架设计,版本和设计逻辑变更等等。

这篇文章主要在于讲述Handler里面的Codec,也就是相关的编解码器。原本想把编解码器写在上一篇文章里面的。后来想想Netty里面的编解码器太多了。想要一次写完比较困难。于是重新开了一篇文章来专门写这个。

1.     Hello World !实例中的使用

  在这里先讲一下我们第一篇文章里面的实例使用到编解码器。

1.1 DelimiterBasedFrameDecoder解码器

  DelimiterBasedFrameDecoder 顾名思义我们可以理解为基于分隔符的帧解码器。参数有两个,一个是最大帧长度,另外一个是定义分隔符。

在Delimiters中提供给我们两种分隔符。一种是“0x00-NUL”分隔符。另外一种就是实例中使用的“\r\n”或“\n”分隔符。

在构造函数中我们可以看出,当分隔符是“\n”的时候,框架默认解码器为基于行的帧解码器(LineBasedFrameDecoder)。否则按照可读取比特长度进行帧解码。

1.2 StringDecoder 字符串解码器 和 编码器

  解码器:将比特流转换为默认编码的字符串。默认编码为UTF-8。当然开发者可以通过设置字符编码参数来设置字符编码。编码器:将字符串转换为Byte[]

2.     Netty中Handler详述

  在Netty的类库的handler目录可以看出它的基本结构(下图):

图2.1 handler包结构

  整个包由6个主要部分组成,笔者将由简入繁,慢慢想读者解释每个包的含义和用法。(若有不正确之处,希望大家能给予指点)

2.1 Logging 日志

    用于Netty中的日志输出。

    2.1.1 loggingHandler

  LoggingHandler 继承于ChannelDuplexHandler。它的注释我们可以看出:“是一个使用日志框架记录全部事件的ChannelHandler,  缺省值是记录全部DEBUG级别以上的事件”。它的功能是记录全部事件,包含Inbound和Outbound的,之所以选择了继承ChannelDuplexHandler,是由于ChannelDuplexHandler 继承ChannelInboundHandlerAdapter 实现ChannelOutboundHandler。所以相当于Netty框架内的全部通信相关的事件都会得到处理。

    2.1.2LogLevel

在这里作者定义了5个级别的log。TRACE,DEBUG,INFO,WARN,ERROR。

  2.2 Ssl

  用于SSL协议解析和编码。

    2.2.1          SslHandler

    熟悉了解过Http的朋友应该是知道ssl的。SSL 的英文全称是 “Secure Sockets Layer” ,中文名为 “ 安全套接层协议层 ” ,它是网景( Netscape )公司提出的基于 WEB 应用的安全协议。 SSL 协议指定了一种在应用程序协议(如 HTTP 、 Telenet 、 NMTP 和 FTP 等)和 TCP/IP 协议之间提供数据安全性分层的机制,它为 TCP/IP 连接提供数据加密、服务器认证、消息完整性以及可选的客户机认证。现在的相当一部分网站都有SSL加密。而SslHander则是Netty提供的Ssl解码编码处理。

    2.2.2          NotSslRecordException 和 SslHandshakeCompletionEvent 抛出异常和处理完成触发事件。

  2.3 Stream 流

  用于文件的的传输。将Java里面的File转换为Stream流,然后进行传输。

  2.4 Timeout 空闲检测

用于Netty框架中空闲超时相关。

IdleState 空闲状态。Netty中的空闲时间包括,读空闲,写空闲和读写空闲3种时间。

顾名思义,读空闲即一段时间内没有接受到消息,写空闲即一段时间内没有发送消息。读写空闲即一段时间内读写都空闲。主要是用于检测空闲状态。并且特定条件下服务端关闭和释放一些资源。

  2.5 Traffic 流量统计

  用于流量统计。

  Netty提供了一个流量统计抽象类,一个Channel流量统计Handler和一个全局带宽流量统计Handler。

  2.6 Codec 编解码器

这个是目前Netty的重点。也是最核心最复杂的部分。也是笔者认为Netty设计里面最好的一部分。

用于数据的编解码。

  编解码器可以理解为订立一个规范让客户端和服务端能够理解和识别字节流所包含的意思。其实编码和解码就是这么简单的事情,没什么复杂的。

  看到codec里面的这么一大堆的包类。读者是不是赶脚着很头晕? O(∩_∩)O哈哈~。作者设计了非常友好的包逻辑结构。方便我们理解源码。

即Codec包中的类优先看,下面的子包都是一些Netty开发者们提供的一些实现。

有没有看到HelloWorld出现的LengthFieldBaseFrameDecoder和FixedLengthFrameDecoder。

这里主要讲的是Netty中最重要的两个编解码器ByteToMessageCodec和MessageToMessageCodec。之所只讲着两个的原因是其他的编解码器都是继承于这两个的。

ByteToMessageCodec:在Netty4.x版本中允许传递Java中的对象,所以这个编解码起的作用就是讲Byte流转换为对象。而MessageToMessageCodec则是将Object转换为Object。这两个的区分其实很模糊。可能需要大家亲自动手写过之后才会有比较好的感受。

包base64:继承MessageToMessageEncoder<ByteBuf>。是base64编码的一些东西。

包bytes:继承MessageToMessageEncoder<ByteBuf>。用于字节数组和Netty里面的ByteBuf互相转换

包compression:用于ByteBuf数据压缩和解压缩的。继承MessageToMessageEncoder<ByteBuf>

包http:用于HTTP请求相关的。这个包里面就比较复杂了。下面详细讲一下。

  1. 包空间:HTTP内容,请求,响应等。
  2. 包cors: 包名称是(跨域资源分享)Cross Origin Resource Sharing 的简写。用于客户端跨域请求。  可以参考 http://www.w3.org/TR/cors/
  3. 包multipart:POST消息和文件上传相关的一些。只是粗略看了一下。
  4. 包websocketx:针对近年来Html5发展起来的websocket技术的。不过貌似由于Html5标准还未正式的确定。所以这个包里面的内容比较多。编解码器版本也很多。相信以后统一标准之后会简单一些。暂时不推荐吧

包marshalling:

包protoBuf:用于Google Protocol Buffers 编解码

包rtsp:实时流传输协议(Real Time Streaming Protocol,RTSP)

包sctp:流控制传输协议(Stream Control Transmission Protocol,SCTP)

包serialization:用于序列化的Java对象的和ByteBuf之间的转换。

包scoks:用于Java Socket通信相关的。支持Socket4a和 Socket 5两个版本

包spdy:SPDY协议是近年来发展的一种协议。主要目的是为了减少网页加载的时间。它是HTTP协议的增强版本。它从某种程度上讲提高了HTTP协议在数据传输时的速度和性能

包string:用于java里面字符串的编解码

作者:TinyZ
出处:http://www.cnblogs.com/zou90512/
关于作者:努力学习,天天向上。不断探索学习,提升自身价值。记录经验分享。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接
如有问题,可以通过 zou90512@126.com 联系我,非常感谢。
笔者网店: http://aoleitaisen.taobao.com. 欢迎广大读者围观

Netty4.x中文教程系列(五)编解码器Codec的更多相关文章

  1. Netty4.x中文教程系列(一) 目录及概述

    Netty4.x中文教程系列(一)目录及概述 Netty 提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序. Netty是一个NIO客户端 服务端框架 ...

  2. Netty4.x中文教程系列(六) 从头开始Bootstrap

    Netty4.x中文教程系列(六) 从头开始Bootstrap 其实自从中文教程系列(五)一直不知道自己到底想些什么.加上忙着工作上出现了一些问题.本来想就这么放弃维护了.没想到有朋友和我说百度搜索推 ...

  3. Netty4.x中文教程系列(三) ChannelHandler

    Netty4.x中文教程系列(四)  ChannelHandler 上一篇文章详细解释了Hello World示例的代码.里面涉及了一些Netty框架的基础. 这篇文章用以解释ChannelHandl ...

  4. Netty4.x中文教程系列(四) 对象传输

    Netty4.x中文教程系列(四)  对象传输 我们在使用netty的过程中肯定会遇到传输对象的情况,Netty4通过ObjectEncoder和ObjectDecoder来支持. 首先我们定义一个U ...

  5. Netty4.x中文教程系列(二) Hello World !

    在中国程序界.我们都是学着Hello World !慢慢成长起来的.逐渐从一无所知到熟悉精通的. 第二章就从Hello World 开始讲述Netty的中文教程. 首先创建一个Java项目.引入一个N ...

  6. Netty4.x中文教程系列(二) Hello World !<转>

    在中国程序界.我们都是学着Hello World !慢慢成长起来的.逐渐从一无所知到熟悉精通的. 第二章就从Hello World 开始讲述Netty的中文教程. 首先创建一个Java项目.引入一个N ...

  7. struts2官方 中文教程 系列五:处理表单

    先贴个本帖的地址,免得其它网站被爬去了struts2教程 官方系列五:处理表单  即 http://www.cnblogs.com/linghaoxinpian/p/6906298.html 下载本章 ...

  8. Netty4.x中文教程系列(三) Hello World !详解

    Netty 中文教程 (二) Hello World !详解 上一篇文章,笔者提供了一个Hello World 的Netty示例. 时间过去了这么久,准备解释一下示例代码. 1.HelloServer ...

  9. Netty4.x中文教程系列(四) ChannelHandler

    这篇文章用以解释ChannelHandler.笔者本身在以前写过文章ChannelHandler改动及影响 和 ChannelInitializer 学习 对Netty的.ChannelHandler ...

随机推荐

  1. 小学生四则运算C/C++编程设计思想

    题目: 1.题目避免重复:        2.可定制(数量(打印方式)):        3.可控制下列参数:是否有乘除法.是否有括号.数值范围.加减有无负数.        除法有无余数.是否支持分 ...

  2. struts1 和 struts2中Action什么时候实例化

    精帖1:http://blog.csdn.net/lfsf802/article/details/7277013 精帖1:http://blog.csdn.net/wmj2003/article/de ...

  3. 转载:Comet:基于 HTTP 长连接的“服务器推”技术

    转自:http://www.ibm.com/developerworks/cn/web/wa-lo-comet/ 很多应用譬如监控.即时通信.即时报价系统都需要将后台发生的变化实时传送到客户端而无须客 ...

  4. eclipse for jee版配置tomcat

    在网上搜到的大多都是插件配置,其实默认的就可以配置tomcat的. 第一步:New -> Other -> Server ,然后选择Apache下的tomcat的版本. 注意:如果Next ...

  5. shell中的比较语句

    Linux比较字符串.判断文件是否存在及是否可读等,通常用"[]"来表示条件测试. 注意:这里的空格很重要.要确保方括号的空格.笔者就曾因为空格缺少或位置不对,而浪费好多宝贵的时间 ...

  6. Dynamic Programming - Part2

    实现如下: public static void main(String[] args) { String squence1 = "ABCBDAB"; String squence ...

  7. js中的null VS undefined

    var a;------>undefined. JS变量的默认值.注意点在于判断变量的值为null.这是错误的.比如 if( a === null ) { // TODO; }; 实际上是und ...

  8. 将HTMLCollection/NodeList/伪数组转换成数组

    这里把符合以下条件的对象称为伪数组(ArrayLike) 1,具有length属性 2,按索引方式存储数据 3,不具有数组的push,pop等方法 如 1,function内的arguments . ...

  9. POJ 2689 Prime Distance (素数筛选法,大区间筛选)

    题意:给出一个区间[L,U],找出区间里相邻的距离最近的两个素数和距离最远的两个素数. 用素数筛选法.所有小于U的数,如果是合数,必定是某个因子(2到sqrt(U)间的素数)的倍数.由于sqrt(U) ...

  10. URAL 1586 Threeprime Numbers(DP)

    题目链接 题意 : 定义Threeprime为它的任意连续3位上的数字,都构成一个3位的质数. 求对于一个n位数,存在多少个Threeprime数. 思路 : 记录[100, 999]范围内所有素数( ...