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;
}