解码器Decoder和ChannelHandler的关系
netty的解码器通常是继承自ByteToMessageDecoder,而它又是继承自ChannelInboundHandlerAdapter,其实也是一种ChannelHandler和我们自定义的ChannelHandler一样都是来处理进入或者出去的数据。常用的几种解码器有:
LineBasedFrameDecoder
DelimiterBasedFrameDecoder
FixedLengthFrameDecoder
LineBasedFrameDecoderLineBasedFrameDecoder 行解码器,遍历ByteBuf中的可读字节,按行(\n \r\n)处理
StringDecoderStringDecoder将接受的码流转换为字符串
代码中使用 @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); //LineBasedFrameDecoder遍历ByteBuf中的可读字节,按行(\n \r\n)处理 pipeline.addLast(new LineBasedFrameDecoder(1024)); //StringDecoder将接受的码流转换为字符串 pipeline.addLast(new StringDecoder()); pipeline.addLast(new NettyServerHandler()); }NettyServerHandler处理类中读取,String message = (String) msg;直接转换为String:
private int count = 0; @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { String message = (String) msg; LOGGER.info("client received message {}:{}", ++count, message); } DelimiterBasedFrameDecoderDelimiterBasedFrameDecoder,将特定分隔符作为码流结束标志的解码器。
代码中使用 @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); ByteBuf byteBuf = Unpooled.copiedBuffer("$_".getBytes()); pipeline.addLast(new DelimiterBasedFrameDecoder(1024,true,true,byteBuf)); pipeline.addLast(new StringDecoder()); pipeline.addLast(new NettyServerHandler()); } FixedLengthFrameDecoderFixedLengthFrameDecoder 固定长度解码器,只会读取指定长度的码流。
代码中使用 @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast(new FixedLengthFrameDecoder(24)); pipeline.addLast(new StringDecoder()); pipeline.addLast(new NettyServerHandler()); }