Netty拆包粘包解決方案
阿新 • • 發佈:2021-01-11
技術標籤: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