public abstract class ByteToMessageDecoder extends ChannelInboundHandlerAdapter
ChannelInboundHandlerAdapter
,它以类似流的方式将字节从一个ByteBuf
解码为另一个消息类型。
例如,这里是一个实现,它从输入ByteBuf
中读取所有可读的字节并创建一个新的ByteBuf
。
public class SquareDecoder extends ByteToMessageDecoder
{
@Override
public void decode(ChannelHandlerContext
ctx, ByteBuf
in, List<Object> out)
throws 异常
{
out.add(in.readBytes(in.readableBytes()));
}
}
一般帧检测应通过加入先前在管道处理DelimiterBasedFrameDecoder
, FixedLengthFrameDecoder
, LengthFieldBasedFrameDecoder
,或LineBasedFrameDecoder
。
如果需要自定义帧解码器,那么在用ByteToMessageDecoder
实现一个时需要小心。 通过检查ByteBuf.readableBytes()
,确保缓冲区中有足够的字节用于完整帧。 如果完整帧没有足够的字节,则返回而不修改阅读器索引以允许更多字节到达。
要在不修改阅读器索引的情况下检查完整帧,请使用ByteBuf.getInt(int)
之类的方法。 当使用ByteBuf.getInt(int)
等方法时, 必须使用阅读器索引。 例如,调用in.getInt(0)假定帧在缓冲区的开始处开始,但情况并非总是如此。 改为使用in.getInt(in.readerIndex()) 。
请注意, ByteToMessageDecoder
的子类不能用@Sharable
注释。
如果返回的缓冲区未释放或添加到out List
某些方法(如ByteBuf.readBytes(int)
)将导致内存泄漏。 使用衍生缓冲区,如ByteBuf.readSlice(int)
以避免内存泄漏。
Modifier and Type | Class and Description |
---|---|
static interface |
ByteToMessageDecoder.Cumulator
累积 ByteBuf s。
|
ChannelHandler.Sharable
Modifier and Type | Field and Description |
---|---|
static ByteToMessageDecoder.Cumulator |
COMPOSITE_CUMULATOR
通过将它们添加到 CompositeByteBuf 来累积ByteBuf ,所以尽可能不要复制存储器。
|
static ByteToMessageDecoder.Cumulator |
MERGE_CUMULATOR
|
Modifier | Constructor and Description |
---|---|
protected |
ByteToMessageDecoder() |
Modifier and Type | Method and Description |
---|---|
protected int |
actualReadableBytes()
返回此解码器的内部累积缓冲区中的可读字节的实际数量。
|
protected void |
callDecode(ChannelHandlerContext ctx, ByteBuf in, java.util.List<java.lang.Object> out)
|
void |
channelInactive(ChannelHandlerContext ctx)
|
void |
channelRead(ChannelHandlerContext ctx, java.lang.Object msg)
|
void |
channelReadComplete(ChannelHandlerContext ctx)
|
protected abstract void |
decode(ChannelHandlerContext ctx, ByteBuf in, java.util.List<java.lang.Object> out)
解码从一个 ByteBuf 到另一个。
|
protected void |
decodeLast(ChannelHandlerContext ctx, ByteBuf in, java.util.List<java.lang.Object> out)
当 ChannelHandlerContext 处于非活动状态时称为最后一次。
|
protected void |
discardSomeReadBytes() |
void |
handlerRemoved(ChannelHandlerContext ctx)
子类可以忽略这个方法。
|
protected void |
handlerRemoved0(ChannelHandlerContext ctx)
在 ByteToMessageDecoder 从实际上下文中移除之后调用,它不再处理事件。
|
protected ByteBuf |
internalBuffer()
返回此解码器的内部累积缓冲区。
|
boolean |
isSingleDecode()
如果
true 则每个
channelRead(ChannelHandlerContext, Object) 呼叫仅解码一条消息。
|
void |
setCumulator(ByteToMessageDecoder.Cumulator cumulator)
设置 ByteToMessageDecoder.Cumulator 用于累计收到的ByteBuf 。
|
void |
setDiscardAfterReads(int discardAfterReads)
设置
ByteBuf.discardSomeReadBytes() 之后的读取次数,释放内存。
|
void |
setSingleDecode(boolean singleDecode)
如果设置,则每个
channelRead(ChannelHandlerContext, Object) 呼叫仅解码一条消息。
|
void |
userEventTriggered(ChannelHandlerContext ctx, java.lang.Object evt)
|
channelActive, channelRegistered, channelUnregistered, channelWritabilityChanged, exceptionCaught
ensureNotSharable, handlerAdded, isSharable
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
handlerAdded
public static final ByteToMessageDecoder.Cumulator MERGE_CUMULATOR
public static final ByteToMessageDecoder.Cumulator COMPOSITE_CUMULATOR
CompositeByteBuf
来累积ByteBuf
s,所以尽可能不要复制存储器。
请注意, CompositeByteBuf
使用更复杂的索引实现,因此取决于您的使用情况和解码器实现,这可能会比使用MERGE_CUMULATOR
更慢。
public void setSingleDecode(boolean singleDecode)
channelRead(ChannelHandlerContext, Object)
呼叫仅解码一条消息。
如果你需要做一些协议升级,并且要确保没有任何混淆,这可能很有用。
默认值为false
因为这会影响性能。
public boolean isSingleDecode()
true
则每个channelRead(ChannelHandlerContext, Object)
呼叫仅解码一条消息。
默认值为false
因为这会影响性能。
public void setCumulator(ByteToMessageDecoder.Cumulator cumulator)
ByteToMessageDecoder.Cumulator
用于累计收到的ByteBuf
。
public void setDiscardAfterReads(int discardAfterReads)
ByteBuf.discardSomeReadBytes()
之后的读取次数,从而释放内存。
默认值是16
。
protected int actualReadableBytes()
internalBuffer().readableBytes()
的快捷方式。
protected ByteBuf internalBuffer()
public final void handlerRemoved(ChannelHandlerContext ctx) throws java.lang.Exception
ChannelHandlerAdapter
handlerRemoved
,界面
ChannelHandler
handlerRemoved
在课程
ChannelHandlerAdapter
java.lang.Exception
protected void handlerRemoved0(ChannelHandlerContext ctx) throws java.lang.Exception
ByteToMessageDecoder
已从实际上下文中移除并且不再处理事件之后调用。
java.lang.Exception
public void channelRead(ChannelHandlerContext ctx, java.lang.Object msg) throws java.lang.Exception
ChannelInboundHandlerAdapter
ChannelHandlerContext.fireChannelRead(Object)
转发到ChannelPipeline
中的下一个ChannelInboundHandler
。
子类可以重写此方法来更改行为。
channelRead
在界面
ChannelInboundHandler
channelRead
在课程
ChannelInboundHandlerAdapter
java.lang.Exception
public void channelReadComplete(ChannelHandlerContext ctx) throws java.lang.Exception
ChannelInboundHandlerAdapter
ChannelHandlerContext.fireChannelReadComplete()
转发到ChannelPipeline
中的下一个ChannelInboundHandler
。
子类可以重写此方法来更改行为。
channelReadComplete
在界面
ChannelInboundHandler
channelReadComplete
在班级
ChannelInboundHandlerAdapter
java.lang.Exception
protected final void discardSomeReadBytes()
public void channelInactive(ChannelHandlerContext ctx) throws java.lang.Exception
ChannelInboundHandlerAdapter
ChannelHandlerContext.fireChannelInactive()
转发至ChannelPipeline
中的下一个ChannelInboundHandler
。
子类可以重写此方法来更改行为。
channelInactive
在界面
ChannelInboundHandler
channelInactive
在课堂上
ChannelInboundHandlerAdapter
java.lang.Exception
public void userEventTriggered(ChannelHandlerContext ctx, java.lang.Object evt) throws java.lang.Exception
ChannelInboundHandlerAdapter
ChannelHandlerContext.fireUserEventTriggered(Object)
转发到ChannelPipeline
中的下一个ChannelInboundHandler
。
子类可以重写此方法来更改行为。
userEventTriggered
,界面
ChannelInboundHandler
userEventTriggered
在课程
ChannelInboundHandlerAdapter
java.lang.Exception
protected void callDecode(ChannelHandlerContext ctx, ByteBuf in, java.util.List<java.lang.Object> out)
ByteBuf
解码。
只要解码应该发生,该方法将调用decode(ChannelHandlerContext, ByteBuf, List)
。
ctx
- ByteToMessageDecoder
所属的ChannelHandlerContext
in
- 从中读取数据的ByteBuf
out
- 应该添加解码消息的
List
protected abstract void decode(ChannelHandlerContext ctx, ByteBuf in, java.util.List<java.lang.Object> out) throws java.lang.Exception
ctx
- ByteToMessageDecoder
属于的ChannelHandlerContext
in
- 从中读取数据的ByteBuf
out
- 应该添加解码消息的
List
java.lang.Exception
- 发生错误时抛出
protected void decodeLast(ChannelHandlerContext ctx, ByteBuf in, java.util.List<java.lang.Object> out) throws java.lang.Exception
ChannelHandlerContext
处于非活动状态时称为最后一次。
这意味着channelInactive(ChannelHandlerContext)
被触发。
默认情况下,这只会调用decode(ChannelHandlerContext, ByteBuf, List)
,但子类可能会覆盖这个对于一些特殊的清理操作。
java.lang.Exception
Copyright © 2008–2018 The Netty Project. All rights reserved.