![](/img/trans.png)
[英]what is the correct usage for StringEncoder and StringDecoder with a netty server?
[英]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());
}
所以我的兩個問題是:
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.