簡體   English   中英

Netty-正確使用解碼器

[英]Netty - Correct usage of a decoder

我再次有一個關於Netty的問題。

我的情況是:

傳入消息(TCP)=標頭[字節,整數,字節]正文[字節]

我有一個包類,其中包含一些方法的標頭和正文。 我的頻道管道是:

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()方法中的直接緩沖區( array()方法)時,如何解決錯誤:“ java.lang.UnsupportedOperationException:直接緩沖區”?

更新:

我像預期的那樣重新制作了解碼器,這是我的結果: http : //pastebin.com/wQz2LbYT

我不確定是否必須將代碼放在這里,因為這篇文章會變得很大。 無論如何,現在看來一切正常:)非常感謝!

您沒有正確使用ByteToMessageDecoder,因為一旦將某些內容添加到列表中(輸出),該方法一旦返回並轉發到ChannelPipeline中的下一個ChannelInboundHandler,它將被刪除。 如果您需要保留對數據包的引用,直到將其添加到外面,請使用該類中的字段。

如果hasArray()返回true,則只能訪問array()。 否則,緩沖區本身將由本機內存支持。 在這種情況下,您將需要使用其getBytes(...)方法之一將內容復制到數組。 也就是說,如果您只想將緩沖區的內容作為字符串獲取,則可以使用ByteBuf.toString(Charset)來實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM