gpt4 book ai didi

java - 这是在 MINA 中编写 ProtocolDecoder 的正确方法吗?

转载 作者:行者123 更新时间:2023-12-01 16:04:37 24 4
gpt4 key购买 nike

public class CustomProtocolDecoder extends CumulativeProtocolDecoder{
byte currentCmd = -1;
int currentSize = -1;
boolean isFirst = false;
@Override
protected boolean doDecode(IoSession is, ByteBuffer bb, ProtocolDecoderOutput pdo) throws Exception {
if(currentCmd == -1)
{
currentCmd = bb.get();
currentSize = Packet.getSize(currentCmd);
isFirst = true;
}
while(bb.remaining() > 0)
{
if(!isFirst)
{
currentCmd = bb.get();
currentSize = Packet.getSize(currentCmd);
}
else
isFirst = false;
//System.err.println(currentCmd + " " + bb.remaining() + " " + currentSize);
if(bb.remaining() >= currentSize - 1)
{
Packet p = PacketDecoder.decodePacket(bb, currentCmd);
pdo.write(p);
}
else
{
bb.flip();
return false;
}
}
if(bb.remaining() == 0)
return true;
else
return false;
}
}

有人发现这段代码有什么问题吗?当一次收到很多数据包时,即使只有一个客户端连接,其中一个也可能在最后被切断(例如 12 字节而不是 15 字节),这显然是不好的。

最佳答案

我发现有点难以理解您要在这里解码的协议(protocol)。那里看起来肯定有点困惑;)

您是否正在编写需要在同一连接上发出许多请求的内容?如果是这样,那就太好了,这就是米娜所擅长的......

通常,我希望 MINA 解码器检查它是否收到完整的消息,如果没有,则将 IoBuffer 的指针返回到它在方法开始时所处的位置。

通常,完整的消息将由分隔符或消息开头的长度字段确定。

api 文档中提供的示例非常好。它正在寻找回车+换行符的分隔符:

http://mina.apache.org/report/trunk/apidocs/org/apache/mina/filter/codec/CumulativeProtocolDecoder.html

关于java - 这是在 MINA 中编写 ProtocolDecoder 的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2889176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com