热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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


原文: http://www.cnblogs.com/zou90512/p/3654163.html


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

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

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

1.     Hello World !实例中的使用

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

1.1 DelimiterBasedFrameDecoder解码器

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

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

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

        

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

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

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

2.     Netty中Handler详述

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

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

图2.1 handler包结构

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

         2.1 Logging 日志

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

    用于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

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

  用于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 流

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

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

  2.4 Timeout 空闲检测

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

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

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

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

  2.5 Traffic 流量统计

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

  用于流量统计。

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

  2.6 Codec 编解码器

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

         用于数据的编解码。

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

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

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

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

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

 

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

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

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

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

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

包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里面字符串的编解码



推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 集成电路企业在进行跨隔离网数据交换时面临着安全性问题,传统的数据交换方式存在安全性堪忧、效率低下等问题。本文以《Ftrans跨网文件安全交换系统》为例,介绍了如何通过丰富的审批流程来满足企业的合规要求,保障数据交换的安全性。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • POCOCLibraies属于功能广泛、轻量级别的开源框架库,它拥有媲美Boost库的功能以及较小的体积广泛应用在物联网平台、工业自动化等领域。POCOCLibrai ... [详细]
  • Linux一键安装web环境全攻略
    摘自阿里云服务器官网,此处一键安装包下载:点此下载安装须知1、此安装包可在阿里云所有Linux系统上部署安装,此安装包包含的软件及版本为& ... [详细]
  • 网络安全是一个非常重要的课题,基本上你运行的服务后台越多,你就可能打开更多的安全漏洞.如果配置的恰当的话,Linux本身是非常安全可靠的,假使在Linux系统中有某个安全缺陷,由于Linu ... [详细]
  • c# java socketn 字节流_C#Socket编程详解(一)TCP与UDP简介
    一、TCP与UDP(转载)1、TCP1.1定义TCP(TransmissionControlProtocol)传输控制协议。是一种可靠的、面向连接的协议(eg:打电话)、传输效率低 ... [详细]
  • 本文讨论了如何使用GStreamer来删除H264格式视频文件中的中间部分,而不需要进行重编码。作者提出了使用gst_element_seek(...)函数来实现这个目标的思路,并提到遇到了一个解决不了的BUG。文章还列举了8个解决方案,希望能够得到更好的思路。 ... [详细]
  • 本人新手,用Unity3D想做一个简单的赛车游戏,现在的问题是转弯的时候很容易出现翻车的情况,求解决思路比如说你的中心是在(0,0,0),你把他设置成(0,-1.0,0)之类的就可 ... [详细]
  • javaftp上传,javaftp下载文件
    本文目录一览:1、javaftp上传5G以上大文件,怎么做 ... [详细]
author-avatar
cxsw01
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有