netty之MessagePack编码器
特点:
编解码高效,性能高;
序列化之后的码流小;
支持跨语言;
结合LengthFieldPrepender和LengthFieldBasedFrameDecoder解决粘拆包:在MessagePack编码器之前增加LengthFieldPrepender,它将在ByteBuf之前增加2个字节的消息长度字段,在MessagePack解码器之前增加LengthFieldBasedFrameDecoder,用于处理半包消息,
这样MessagePackDecoder接收到的永远是整包消息;
MessagePackDecoder.java
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageDecoder;
import org.msgpack.MessagePack;
import java.util.List;
/**
* 解码器
*/
public class MessagePackDecoder extends MessageToMessageDecoder<ByteBuf> {
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> list) throws Exception {
// TODO Auto-generated method stub
final int length = msg.readableBytes();
byte[] b = new byte[length];
msg.getBytes(msg.readerIndex(), b,0,length);
MessagePack messagePack = new MessagePack();
//讲数据传给下一个handler
list.add(messagePack.read(b));
}
}
MessagePackEncoder.java
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
import org.msgpack.MessagePack;
/**
* 编码器
*/
public class MessagePackEncoder extends MessageToByteEncoder {
@Override
protected void encode(ChannelHandlerContext ctx, Object msg, ByteBuf buf) throws Exception {
// TODO Auto-generated method stub
MessagePack messagePack = new MessagePack();
buf.writeBytes(messagePack.write(msg));
}
}
代码已上传至github:https://github.com/beibeirenzhe/netty-im/tree/master/fyrtim