在您的服务器“nety”测试期间,我遇到了一个令人不快的问题。 我模仿通信非常差的情况,并且两个数据包同时到达。
服务器必须按如下方式处理数据包:
income binary packet
|
transcription packet into my POJO Message class object (objects if few messages in one packet found)
|
filtering unexpected messages
|
do Logic on every message
但是当在一个收入数据包中找到两条消息时,只会处理第一条消息。
将收入字节转录为消息类型
的解码器 public class InboundDecryptor extends ByteToMessageDecoder {
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
// identified =false;
ArrayList<Message> results = new ArrayList<>();
byte[] byteinput = new byte[in.readableBytes()];
in.readBytes(byteinput);
Message lastIncome = ctx.channel().attr(Server.getLastIncomeKey()).get();
LOG.debug("RawIncome: " + Message.bytesToHex(byteinput) + "\nlength: " + byteinput.length);
ArrayList<byte[]> packets = PacketGet.getBytePackets(byteinput);
if (packets != null & !packets.isEmpty()) { //send packets to decryption
for (byte[] packet : packets) {
byte[] decrypted;
decrypted = ctx.channel().attr(Server.cypherattrkey).get().decrypt(packet);
LOG.debug(("bytesIn:" + Message.bytesToHex(decrypted)));
Message message = PacketGet.toMessage(decrypted);
if (message != null) {
LOG.debug(message.toString());
if (checkNumber(message, ctx, out)) {
out.add((Object) message); //send packets to further managing
} else {
skipDC = true;
}
}
}
}
if (out.isEmpty() && !skipDC) {
skipDC = false;
LOG.debug("Nothing was parsed");
ctx.close();
}
}
接下来是过滤器处理消息并丢掉意外的消息。
public class ResponseHandler extends MessageToMessageCodec<Message, Message> {
@Override
protected void decode(ChannelHandlerContext ctx, Message msg, List<Object> out) throws Exception {
//throw away unexpected messages
//put correct messages into out
}
}
最后执行逻辑的处理程序
public class HandlePackets extends SimpleChannelInboundHandler {
@Override
public void channelRead0(ChannelHandlerContext ctx, Object message) throws Exception {
//doing logic
}
为什么,当几条消息同时出现时,只处理一个消息? 也许是因为两个解码器一个接一个地停留?
UPD
我为消息处理编写了loggin,现在我可以说,第二条消息不会进入第二个解码器。