Netty Decoder Encode

阅读数:75 评论数:0

跳转到新版页面

分类

python/Java

正文

Netty提供了丰富的解码器抽象基类:主要分为两类:

(1)解码字节到消息(ByteToMessageDecoder和ReplayingDecoder)

(2)解码消息到消息(MessageToMessageDecoder)

ByteToMessageDecoder

用于将字节转为信息(或其它字节序列)。

在下面的例子中,将实现从入站ByteBuf读取每个整数将其传递给pipeline中的下一个ChannalInboundHandler。

/**
 * 读取四字节,解码成整形
 * 继承于 ByteToMessageDecoder
 *
 */
public class ToIntegerDecoder extends ByteToMessageDecoder {
 
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        if(in.readableBytes() >= 4) {        // int是4字节
            out.add(in.readInt());            // 添加到解码信息的List中
        }
    }
 
}

注意,一旦一个消息被编码或解码会自动调用ReferenceCountUtil.release(message)。如果你稍后还需要用这个引用,可以调用ReferenceCountUtil.retain(message)。

ReplayingDecoder

上面的例子读取缓冲区的数据之前需要检查缓冲区是否有足够的字节,使用ReplayingDecoder就无需自己检查。若ByteBuf中不足够的字节,则会正常读取,若没有足够的字节则会停止解码。

/**
 * 读取四字节,解码成整形
 * 继承于ReplayingDecoder,不需要检查缓存区是否有足够的字节
 *
 */
public class ToIntegerDecoder2 extends ReplayingDecoder<Void> {
 
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        out.add(in.readInt());    // 读取整形并添加到解码信息的List中
    }
    
}

MessageToMessageDecoder

用于从一种消息解码为另一种消息(例如,POJO到POJO)。与上面类似

/**
 * 将整形解码为字符串
 * 继承于MessageToMessageDecoder
 *
 */
public class IntegerToStringDecoder extends MessageToMessageDecoder<Integer> {
 
    @Override
    protected void decode(ChannelHandlerContext ctx, Integer msg, List<Object> out) throws Exception {
        out.add(String.valueOf(msg));    // 将整形转换为字符串
    }
    
}

MessageToByteEncoder

把message再转换为bytes.

package codec;
 
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
 
public class IntegerToByteEncoder extends MessageToByteEncoder<Short> {
    @Override
    public void encode(ChannelHandlerContext ctx, Short msg, ByteBuf out)
            throws Exception {
        out.writeShort(msg);
    }
}

MessageToMessageEncoder

POJO-》POJO

package codec;
 
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageEncoder;
 
import java.util.List;
 
public class IntegerToStringEncoder extends MessageToMessageEncoder<Integer> {
    @Override
    public void encode(ChannelHandlerContext ctx, Integer msg,
                       List<Object> out) throws Exception {
        out.add(String.valueOf(msg));
    }
}
 



相关推荐

LineBasedFrameDecoder以换行符\n或\r\n作为依据,遇到\r\n都认为是一条完整的消息。 而DelimiterBasedFrameDecoder允许我们指定任

一、概述 一个Netty的ByteBuf包,可以被TCP拆分成多个二进制数据帧进行发送,也有可能,底层将多个小的ByteBuf包,封装成一个大的底层数据帧发送出去。 如何从底层的二进制数据帧中,界定出

Java NIO根据操作系统不同,比如macosx是KQueueSelectorProvider、windows有WindowsSelectorProvider、Linux有EPollSelec

一、概述 Netty的强大的地方,是他能方便的实现自定义协议的网络传输。Netty基于Reactor模式:http://1024s.top/mbstudy/mbBlog/blogDetail?blog

netty提供了6种不同的websocket类型: (1)BinaryWebsocketFrame,二进制数据类型 (2)TextWebSocketFrame,文本数

一、概述 在计算机中,我们以字节为单位,一个字节为8bit。 而数据存储中的字节顺序多取决于硬件设计,即所谓的大端存储和小端存储。Intel处理器使用小端存储,PowerPc的处理器采用大端存储。 当

一、Channel的四大类型 1、FileChannel FileChannel是操作文件的Channel,可以通过FileChannel从一个文件中读取数据,也

ByteBuf是对字节的封装,有基于堆内存和直接内存。若是堆内存,应用程序无需考虑什么时候释放,因为GC是帮助做,如果是直接内存,那么需要主动释放。 每个ByteBuf对象都有一个引用计数,当这个数值

Netty中的HashedWheelTimer可以用于提交延迟任务,Java里的Time组件也具备相同的功能,不过Time是基于执行是基于优先队列实现的,相当于需要对所有的任务基于执行的时间排个

一、netty客户端流控 1、这几种情况下,如果客户端没有流控保护,很容易发生内存泄露。 (1)网络瓶颈,当客户端发送速度超过网络链路处理能力,会导致客户端发送队列积压。 (2)当对端读取速度小于已方