netty codec部分剖析
针对netty 3.2进行剖析
今天用到了netty的encoder和decoder(coder其本质还是handler),特剖析一个netty提供的coder,从而选择或者实现我自己的coder。
1. 为什么要进行encoder和decoder?
众所周知,网络传输的是字节流,而我们面向对象编程操作都是对象或者基本数据类型,因此在传输前需要将对象或基本类型转换为字节;而在接收到
后又要将字节转换为对象或基本类型。同时,对于netty是基于nio的框架,而nio相对应oio的一个显著特点就是传输是基于缓冲的(buffer),故在netty中传输前:对象-->channelBuffer,接收后:channelBuffer-->对象。netty的所有coder实现都是基于这个准则进行的。
2. coder包结构:
可以看出netty已经实现了好多中不同类型的coder,用来支持不同的类型或协议。
3. 下面对org.jboss.netty.handler.codec.serialization包中的ObjectEncoder和ObjectDecoder进行剖析:
可以看到ObjectEncoder类的encoder()方法:
@Override
79 protected Object encode(ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception {
80 ChannelBufferOutputStream bout =
81 new ChannelBufferOutputStream(dynamicBuffer(
82 estimatedLength, ctx.getChannel().getConfig().getBufferFactory()));
83 bout.write(LENGTH_PLACEHOLDER);
84 ObjectOutputStream oout = new CompactObjectOutputStream(bout);
85 oout.writeObject(msg);
86 oout.flush();
87 oout.close();
88
89 ChannelBuffer encoded = bout.buffer();
90 encoded.setInt(0, encoded.writerIndex() - 4);
91 return encoded;
92 }
跟进去看CompactObjectOutputStram类的writeObject()方法,其实就是使用了java自身提供的序列化机制ObjectOutputStream类的writerObject()方法。
而ObjectDecoder类的decode()方法,也是基于java的对象序列化原则进行的,略。
netty codec部分剖析的更多相关文章
- Netty 源码剖析之 unSafe.write 方法
前言 在 Netty 源码剖析之 unSafe.read 方法 一文中,我们研究了 read 方法的实现,这是读取内容到容器,再看看 Netty 是如何将内容从容器输出 Channel 的吧. 1. ...
- Netty源码剖析-关闭服务
参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! ----主线: ----源码: 先在服务端加个断点和修改下代码:如 ...
- Netty源码剖析-断开连接
参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! ----主线: ----源码: 在NioEventLoop的unsa ...
- Netty源码剖析-发送数据
参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! 开始之前先介绍下Netty写数据的三种方式: ①:write:写到一 ...
- Netty源码剖析-业务处理
参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! ----主线:worker thread 触发pipeline.fi ...
- Netty源码剖析-接受数据
参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! ----主线:worker thread ①多路复用器(Select ...
- Netty源码剖析-构建链接
参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! ----主线: 和启动一样也是有两个线程完成的,boss threa ...
- Netty源码剖析-启动服务
参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! --1主线分两步: 一:首先在our thread里,如果写在mai ...
- Netty学习笔记(三)——netty源码剖析
1.Netty启动源码剖析 启动类: public class NettyNioServer { public static void main(String[] args) throws Excep ...
随机推荐
- js react 全选和反选
onCheckAll = (data) => { var CheckBox = document.getElementsByName(data); for(let i=0;i<CheckB ...
- Apdex——衡量服务器性能的标准
Apdex 全称是 Application Performance Index,是由 Apdex 联盟开放的用于评估应用性能的工业标准.Apdex 联盟起源于 2004 年,由 Peter Sevci ...
- time machine不备份指定文件夹
osx中常常会使用timemachine来备份一些文件,timemachine能够使某个文件夹恢复到之前某个时刻的状态,很的方便.但是备份须要空间,特别是有些我们并不想备份一些无关紧要的文件,比方电影 ...
- HTML页面底部无用留白
HTML页面底部无用留白,可以再footer样式中加入: overflow: hidden; 如有错误,请您指正~
- LeetCode——Reverse Integer
Reverse digits of an integer. Example1: x = 123, return 321 Example2: x = -123, return -321 Have you ...
- 【转载】C# sleep 和wait的区别
eep和wait都是使线程暂时停止执行的方法,但它们有很大的不同. 1. sleep是线程类Thread 的方法,它是使当前线程暂时睡眠,可以放在任何位置. 而wait,它是使当前线程暂时放弃对象的使 ...
- 斯坦福《机器学习》Lesson6感想———1、函数间隔和几何间隔
这一课主要是从怎样推断一个机器学习分类算法里拟合的參数是最佳參数引出函数间隔和几何间隔的定义. 1.函数间隔 如果假想函数 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkb ...
- Desktop Management Interface & System Management BIOS
http://en.wikipedia.org/wiki/Desktop_Management_Interface Desktop Management Interface From Wikipedi ...
- 关于MP4视频拖动的原理与分析(一)
本来想说说关于mp4和一些常见视频文件格式方面的历史. 如今想想没啥必要.毕竟本文是在讲关于mp4点播拖动方面的技术细节. 绪论,前言神马的显得有点多余. 说起MP4.不得不提"Digita ...
- MTK 手机芯片 2014 Roadmap
注:其中 A53 架构的是 64 位处理器. MT6733 魅蓝 MT6752 魅族 note 联通/移动版 MT6595 魅族 MX4