netty codec部分剖析
2020-12-13 16:56
标签:style code java http tar ext 针对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()方法: 而ObjectDecoder类的decode()方法,也是基于java的对象序列化原则进行的,略。 netty codec部分剖析,搜素材,soscw.com netty codec部分剖析 标签:style code java http tar ext 原文地址:http://blog.csdn.net/xyls12345/article/details/32154735 @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()方法。