代码是这个逻辑,传输内容的前8位代表长度,获取长度后,在收到信息的长度等于获取到的内容长度时。将信息添加处理。但是如果客户端调用时计算长度错误,就会在这里阻塞。这个情景使用IdleStateHandler 时无法进行超时处理的。该如何才能够设置这个超时呢。
protected void decode(ChannelHandlerContext context, ByteBuf byteBuf, List<Object> list) {
int length = byteBuf.readableBytes();
if(length==0)
return;
byte[] message = new byte[length];
byteBuf.readBytes(message);
if (content != null) {
System.arraycopy(message,0,content,receiveLength+8,length);
}
receiveLength +=length;
//如果还没获取总长度
if (xmlLength == 0) {
byte[] l= Arrays.copyOf(message,8);
xmlLength = Integer.parseInt(new String(l));
content=new byte[xmlLength+8];
System.arraycopy(message,0,content,0,length);
}
if (xmlLength == receiveLength) {
//将报文信息打印到控制台查看
if(content!=null) {
String recv = new String(content, StandardCharsets.UTF_8);
log.info("收到报文:" + recv);
log.info("总长度:[" + xmlLength + "] 接收长度:[" + receiveLength + "]");
list.add(recv);
}
}
}