1. 程式人生 > 其它 >Netty拆包粘包解決方案

Netty拆包粘包解決方案

技術標籤:netty

本文講解如何避免Netty拆包粘包,導致亂碼,資料不一致問題

  • 傳送資料的時候,也一併傳送資料的長度

在這裡插入圖片描述

自定義協議包

public class MyMessageProtocol {
	//定義一次傳送包體長度
    private int len;
    //一次傳送包體內容
    private byte[] content;
    ...get set方法
}

自定義解碼

public class MyMessageDecoder extends ByteToMessageDecoder {

    int length = 0;

    @Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { System.out.println(); System.out.println("MyMessageDecoder decode 被呼叫"); //需要將得到二進位制位元組碼-> MyMessageProtocol 資料包(物件) System.out.println(in); if
(in.readableBytes() >= 4) { if (length == 0){ length = in.readInt(); } if (in.readableBytes() < length) { System.out.println("當前可讀資料不夠,繼續等待。。"); return; } byte[] content = new byte
[length]; if (in.readableBytes() >= length){ in.readBytes(content); //封裝成MyMessageProtocol物件,傳遞到下一個handler業務處理 MyMessageProtocol messageProtocol = new MyMessageProtocol(); messageProtocol.setLen(length); messageProtocol.setContent(content); out.add(messageProtocol); } length = 0; } } }

自定義編碼

public class MyMessageEncoder extends MessageToByteEncoder<MyMessageProtocol> {
    @Override
    protected void encode(ChannelHandlerContext ctx, MyMessageProtocol msg, ByteBuf out) throws Exception {
        System.out.println("MyMessageEncoder encode 方法被呼叫");
        out.writeInt(msg.getLen());
        out.writeBytes(msg.getContent());
    }
}

詳細程式碼:Github