Netty--粘包與分包

BtWangZhi發表於2017-10-06

1 在Netty框架的使用過程中,會出現粘包和分包情況,主要是沒有一個穩定的資料結構,可以採用長度加資料的資料結構來避免這種情況。
如下例子:

/**
     * 解碼器
     */
    @Override
    protected Object decode(ChannelHandlerContext ctx, Channel channel,
            ChannelBuffer buffer) throws Exception {
        // 讀到的是包頭
        if (buffer.readableBytes() >= BASE_LENTH) {
            // 記錄包頭開始的index
            Integer beginReader = buffer.readerIndex();
            while (true) {
                if (buffer.readInt() == ConstantValue.FLAG) {
                    break;
                }
            }
            // 模組號
            short module = buffer.readShort();
            // 命令號
            short cmd = buffer.readShort();
            // 長度
            int dataLength = buffer.readInt();
            // 判斷請求資料包資料是否到齊
            if (buffer.readableBytes() < dataLength) {
                // 還原讀指標,資料全部來後全部資料再次讀取。
                buffer.readerIndex(beginReader);
                // 等待資料來
                return null;
            }
            byte[] data = new byte[dataLength];
            buffer.readBytes(data);
            Request request = new Request();
            request.setModule(module);
            request.setCmd(cmd);
            request.setData(data);
            // 繼續往下執行
            return request;
        }
        return null;
    }

相關文章