netty自定義Decoder用於自定義協議

neuyu發表於2021-09-09

在使用netty時由於自定義協議的分割符是在資料包體的頭部,netty提供的DelimiterBasedFrameDecoder並不能滿足我們的需求。


自定義的decode如下

package com.llvision.netty.decoder;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;

/**
 * @author yd
 * 2017/04/08
 */
public class CustomFrameDecoder  extends ByteToMessageDecoder {
    private final Logger logger= LoggerFactory.getLogger(CustomFrameDecoder.class);
    private static int HEADER_SIZE = 4;
    private final ByteBuf delimiter;
    private final int maxFrameLength;
    private static ByteBuf buf = Unpooled.buffer();

    public CustomFrameDecoder(int maxFrameLength,ByteBuf delimiter ) {
        this.delimiter = delimiter;
        this.maxFrameLength = maxFrameLength;
    }

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception {
        Object decoded = this.decode(ctx, in);
        if(decoded != null) {
            out.add(decoded);
        }
    }

    protected Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception {
        in.markReaderIndex();
        int headerOffset = indexOf(in, delimiter);
        if (headerOffset 

但在使用該解碼器用客戶端施加壓力時,可達到1s 2000個的資料併發量。當大於這個量時會方式解析崩潰的問題,猜測是Tcp粘包的問題。也可能是機器效能問題。還請解答

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4550/viewspace-2807682/,如需轉載,請註明出處,否則將追究法律責任。

相關文章