gpt4 book ai didi

java - Netty - 解码器的正确使用

转载 作者:行者123 更新时间:2023-11-29 03:18:15 25 4
gpt4 key购买 nike

我再次有一个关于 Netty 的问题。

我的场景是:

传入消息 (TCP) = header[byte,int,byte] body[bytes]

我有一个数据包类,它使用一些方法保存 header 和正文。我的 channel 管道是:

ProtocolDecoder > SessionHandler

我对 ProtocolDecoder 的想法是它接收一条消息,将其拆分并创建一个 Packet 变量以传递给管道中的下一个处理程序。

ProtocolDecoder类的代码:

public class ProtocolDecoder extends ByteToMessageDecoder {

@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {

int opCode;
int length;
boolean encrypt;

if (in.readableBytes() < 6) {
return;
}

if (out.size() != 1) {
Packet pa = new Packet();
opCode = in.readByte();
length = in.readInt();
encrypt = in.readByte() == 1;
pa.setOpcode(opCode);
pa.setEncrypted(encrypt);
pa.setLength(length);
out.add(pa);
in.discardReadBytes();
}

Packet p = (Packet) out.get(0);

if (in.readableBytes() >= p.getLength()) {
p.setPayload(in.copy());
}
}

}

SessionHandler 有这段代码:

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
Packet p = (Packet) msg;
System.out.println("Packet: " + p.toString());
}

所以我的两个问题是:

  • 这是 ByteToMessageDecoder 的正确用法吗?
  • 如何解决在 toString() 包的方法?

更新:

我按照预期重新制作了解码器,这是我的结果:http://pastebin.com/wQz2LbYT

我不确定是否必须将代码放在这里,因为这篇文章会变得很大。无论如何,它现在似乎工作正常 :) 非常感谢!

最佳答案

您没有正确使用 ByteToMessageDecoder,因为一旦您将某些内容添加到列表(输出),一旦该方法返回并转发到 ChannelPipeline 中的下一个 ChannelInboundHandler,它就会被删除。如果您需要保留对数据包的引用,直到将其添加到 out 中,请为它使用类中的字段。

只有 hasArray() 返回 true 时,您才能访问 array()。否则缓冲区本身由 native 内存支持。在这种情况下,您将需要使用其 getBytes(...) 方法之一将内容复制到数组。也就是说,如果您只想将缓冲区的内容作为字符串获取,您可以为此使用 ByteBuf.toString(Charset) 。

关于java - Netty - 解码器的正确使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25222392/

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