1、编写网络应用程序时,因为数据在网络中传输的都是二进制字节码数据,在发送数据时就需要编码,接收数据时就需要解码 ,codec(编解码器) 的组成部分有两个:decoder(解码器)和 encoder(编码器)。encoder 负责把业务数据转换成字节码数据,decoder 负责把字节码数据转换成业务数据。
2、netty提供的编码器和解码器有:
StringEncoder,对字符串数据进行编码 ObjectEncoder,对 Java 对象进行编码 StringDecoder, 对字符串数据进行解码 ObjectDecoder,对 Java 对象进行解码 MessageToByteEncoder 编码器,这个解码器是一个抽象类,需要实现它提供的方法来完成自己的业务需求。 ByteToMessageDecoder 解码器,这个解码器是一个抽象类,需要实现它提供的方法来完成自己的业务需求。 ReplayingDecoder<s> 解码器, 参数S指定了用户状态管理的类型,其中Void代表不需要状态管理 LineBasedFrameDecoder:这个类在Netty内部也有使用,它使用行尾控制字符(\n或者\r\n)作为分隔符来解析数据。 |
3、使用自定义编码器来进行编码和解码处理消息:
解码器1: public class MyByteToLongDecoder extends ByteToMessageDecoder { /** * 解码器的方法 * @param channelHandlerContext * @param byteBuf * @param list * @throws Exception */ @Override protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception { System.out.println("MyByteToLongDecoder解码器被调用..."); if(byteBuf.readableBytes() > 8){ list.add(byteBuf.readLong()); } } } 解码器2: public class MyByteToLongDecoder2 extends ReplayingDecoder<Void>{ /** * 街按摩器方法 * @param channelHandlerContext * @param byteBuf * @param list * @throws Exception |