1.自定義字符作為包分隔符
/**
*在實現(xiàn)ChannelInitializer接口的initChannel(SocketChannel sc)里添加過濾器
*/
public void initChannel(SocketChannel sc) throws Exception{
ByteBuf buf = Unpolled.copiedBuf("mc".getBytes());
//這里設(shè)置的是mc為包與包之間的分隔符,所以每出現(xiàn)一次mc就切割為一個包纺非,注意的是設(shè)置為分隔符的mc將不會出現(xiàn)在最后的信息里乞巧。
//并且這里設(shè)置了最大長度為1024個字節(jié)湃崩,如果超過了1024個字節(jié)還沒有出現(xiàn)分隔符,會拋出異常
DelimiterBasedFrameDecoder decoder = new DelimiterBasedFrameDecoder(1024,buf);
sc.pipechannel.addLast(decoder);
}
2.基于換行符 "\n" "\n\r"的包分隔符
/**
*在實現(xiàn)ChannelInitializer接口的initChannel(SocketChannel sc)里添加過濾器
*/
public void initChannel(SocketChannel sc) throws Exception{
//每出現(xiàn)換行符自動拆包,設(shè)置最大長度為1024個字節(jié)楼熄。
LineBasedFrameDecoder decoder = new LineBasedFrameDecoder(1024);
sc.pipechannel.addLast(decoder);
}
3.固定長度包
如果我們的包是固定長度的捞镰,可以設(shè)置固定長度的解碼器來處理
/**
*在實現(xiàn)ChannelInitializer接口的initChannel(SocketChannel sc)里添加過濾器
*/
public void initChannel(SocketChannel sc) throws Exception{
//以1024為固定長度拆包闸与。
FixedLengthFrameDecoder decoder = new FixedLengthFrameDecoder(1024);
sc.pipechannel.addLast(decoder);
}