Added JavaDoc for handler.codec.frame package.
This commit is contained in:
parent
a79f3ff159
commit
26a1d6e429
@ -27,6 +27,41 @@ import org.jboss.netty.channel.Channel;
|
|||||||
import org.jboss.netty.channel.ChannelHandlerContext;
|
import org.jboss.netty.channel.ChannelHandlerContext;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* A {@link FrameDecoder} which decodes the received {@link ChannelBuffer}s
|
||||||
|
* into the {@link ChannelBuffer}s split by one or more delimiters. It is
|
||||||
|
* particularly useful for decoding the frames which ends with a delimiter
|
||||||
|
* such as {@link Delimiters#nulDelimiter() NUL} or
|
||||||
|
* {@linkplain Delimiters#lineDelimiter() newline characters}.
|
||||||
|
*
|
||||||
|
* <h3>Predefined delimiters</h3>
|
||||||
|
* <p>
|
||||||
|
* {@link Delimiters} defines frequently used delimiters for convenience' sake.
|
||||||
|
*
|
||||||
|
* <h3>Specifying more than one delimiter</h3>
|
||||||
|
* <p>
|
||||||
|
* {@link DelimiterBasedFrameDecoder} allows you to specify more than one
|
||||||
|
* delimiter. If more than one delimiter is found in the buffer, it chooses
|
||||||
|
* the delimiter which produces the shortest frame. For example, if you have
|
||||||
|
* the following data in the buffer:
|
||||||
|
* <pre>
|
||||||
|
* +--------------+
|
||||||
|
* | ABC\nDEF\r\n |
|
||||||
|
* +--------------+
|
||||||
|
* </pre>
|
||||||
|
* a {@link DelimiterBasedFrameDecoder}{@code (}{@link Delimiters#lineDelimiter() Delimiters.lineDelimiter()}{@code )}
|
||||||
|
* will choose {@code '\n'} as the first delimiter and produce two frames:
|
||||||
|
* <pre>
|
||||||
|
* +-----+-----+
|
||||||
|
* | ABC | DEF |
|
||||||
|
* +-----+-----+
|
||||||
|
* </pre>
|
||||||
|
* rather than incorrectly choosing {@code '\r\n'} as the first delimiter:
|
||||||
|
* <pre>
|
||||||
|
* +----------+
|
||||||
|
* | ABC\nDEF |
|
||||||
|
* +----------+
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
* @author The Netty Project (netty-dev@lists.jboss.org)
|
* @author The Netty Project (netty-dev@lists.jboss.org)
|
||||||
* @author Trustin Lee (tlee@redhat.com)
|
* @author Trustin Lee (tlee@redhat.com)
|
||||||
*
|
*
|
||||||
@ -39,6 +74,14 @@ public class DelimiterBasedFrameDecoder extends FrameDecoder {
|
|||||||
private final ChannelBuffer[] delimiters;
|
private final ChannelBuffer[] delimiters;
|
||||||
private final int maxFrameLength;
|
private final int maxFrameLength;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance.
|
||||||
|
*
|
||||||
|
* @param maxFrameLength the maximum length of the decoded frame.
|
||||||
|
* A {@link TooLongFrameException} is thrown if
|
||||||
|
* the length of the frame exceeds this value.
|
||||||
|
* @param delimiter the delimiter
|
||||||
|
*/
|
||||||
public DelimiterBasedFrameDecoder(int maxFrameLength, ChannelBuffer delimiter) {
|
public DelimiterBasedFrameDecoder(int maxFrameLength, ChannelBuffer delimiter) {
|
||||||
validateMaxFrameLength(maxFrameLength);
|
validateMaxFrameLength(maxFrameLength);
|
||||||
validateDelimiter(delimiter);
|
validateDelimiter(delimiter);
|
||||||
@ -49,6 +92,14 @@ public class DelimiterBasedFrameDecoder extends FrameDecoder {
|
|||||||
this.maxFrameLength = maxFrameLength;
|
this.maxFrameLength = maxFrameLength;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance.
|
||||||
|
*
|
||||||
|
* @param maxFrameLength the maximum length of the decoded frame.
|
||||||
|
* A {@link TooLongFrameException} is thrown if
|
||||||
|
* the length of the frame exceeds this value.
|
||||||
|
* @param delimiters the delimiters
|
||||||
|
*/
|
||||||
public DelimiterBasedFrameDecoder(int maxFrameLength, ChannelBuffer... delimiters) {
|
public DelimiterBasedFrameDecoder(int maxFrameLength, ChannelBuffer... delimiters) {
|
||||||
validateMaxFrameLength(maxFrameLength);
|
validateMaxFrameLength(maxFrameLength);
|
||||||
if (delimiters == null) {
|
if (delimiters == null) {
|
||||||
|
@ -26,6 +26,8 @@ import org.jboss.netty.buffer.ChannelBuffer;
|
|||||||
import org.jboss.netty.buffer.ChannelBuffers;
|
import org.jboss.netty.buffer.ChannelBuffers;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* A set of delimiters for {@link DelimiterBasedFrameDecoder} for common use.
|
||||||
|
*
|
||||||
* @author The Netty Project (netty-dev@lists.jboss.org)
|
* @author The Netty Project (netty-dev@lists.jboss.org)
|
||||||
* @author Trustin Lee (tlee@redhat.com)
|
* @author Trustin Lee (tlee@redhat.com)
|
||||||
*
|
*
|
||||||
@ -34,11 +36,19 @@ import org.jboss.netty.buffer.ChannelBuffers;
|
|||||||
*/
|
*/
|
||||||
public class Delimiters {
|
public class Delimiters {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a {@code NUL (0x00)} delimiter, which could be used for
|
||||||
|
* Flash XML socket or any similar protocols.
|
||||||
|
*/
|
||||||
public static ChannelBuffer[] nulDelimiter() {
|
public static ChannelBuffer[] nulDelimiter() {
|
||||||
return new ChannelBuffer[] {
|
return new ChannelBuffer[] {
|
||||||
ChannelBuffers.wrappedBuffer(new byte[] { 0 }) };
|
ChannelBuffers.wrappedBuffer(new byte[] { 0 }) };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns {@code CR ('\r')} and {@code LF ('\n')} delimiters, which could
|
||||||
|
* be used for text-based line protocols.
|
||||||
|
*/
|
||||||
public static ChannelBuffer[] lineDelimiter() {
|
public static ChannelBuffer[] lineDelimiter() {
|
||||||
return new ChannelBuffer[] {
|
return new ChannelBuffer[] {
|
||||||
ChannelBuffers.wrappedBuffer(new byte[] { '\r', '\n' }),
|
ChannelBuffers.wrappedBuffer(new byte[] { '\r', '\n' }),
|
||||||
|
@ -27,16 +27,36 @@ import org.jboss.netty.channel.Channel;
|
|||||||
import org.jboss.netty.channel.ChannelHandlerContext;
|
import org.jboss.netty.channel.ChannelHandlerContext;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* A {@link FrameDecoder} which decodes the received {@link ChannelBuffer}s
|
||||||
|
* into the {@link ChannelBuffer}s of the fixed length. For example, if you
|
||||||
|
* received the following four fragmented packets:
|
||||||
|
* <pre>
|
||||||
|
* +---+----+------+----+
|
||||||
|
* | A | BC | DEFG | HI |
|
||||||
|
* +---+----+------+----+
|
||||||
|
* </pre>
|
||||||
|
* A {@link FixedLengthFrameDecoder}{@code (3)} will decode them into the
|
||||||
|
* following three packets with the fixed length:
|
||||||
|
* <pre>
|
||||||
|
* +-----+-----+-----+
|
||||||
|
* | ABC | DEF | GHI |
|
||||||
|
* +-----+-----+-----+
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
* @author The Netty Project (netty-dev@lists.jboss.org)
|
* @author The Netty Project (netty-dev@lists.jboss.org)
|
||||||
* @author Trustin Lee (tlee@redhat.com)
|
* @author Trustin Lee (tlee@redhat.com)
|
||||||
*
|
*
|
||||||
* @version $Rev:231 $, $Date:2008-06-12 16:44:50 +0900 (목, 12 6월 2008) $
|
* @version $Rev:231 $, $Date:2008-06-12 16:44:50 +0900 (목, 12 6월 2008) $
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class FixedLengthFrameDecoder extends FrameDecoder {
|
public class FixedLengthFrameDecoder extends FrameDecoder {
|
||||||
|
|
||||||
private final int frameLength;
|
private final int frameLength;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance.
|
||||||
|
*
|
||||||
|
* @param frameLength the length of the frame
|
||||||
|
*/
|
||||||
public FixedLengthFrameDecoder(int frameLength) {
|
public FixedLengthFrameDecoder(int frameLength) {
|
||||||
if (frameLength <= 0) {
|
if (frameLength <= 0) {
|
||||||
throw new IllegalArgumentException(
|
throw new IllegalArgumentException(
|
||||||
|
@ -38,8 +38,7 @@ import org.jboss.netty.channel.MessageEvent;
|
|||||||
import org.jboss.netty.channel.SimpleChannelHandler;
|
import org.jboss.netty.channel.SimpleChannelHandler;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Assembles and splits incoming {@link ChannelBuffer}s into a meaningful
|
* Decodes the received {@link ChannelBuffer}s into a meaningful frame object.
|
||||||
* frame object.
|
|
||||||
* <p>
|
* <p>
|
||||||
* In a stream-based transport such as TCP/IP, packets can be fragmented and
|
* In a stream-based transport such as TCP/IP, packets can be fragmented and
|
||||||
* reassembled during transmission even in a LAN environment. For example,
|
* reassembled during transmission even in a LAN environment. For example,
|
||||||
@ -57,18 +56,17 @@ import org.jboss.netty.channel.SimpleChannelHandler;
|
|||||||
* +----+-------+---+---+
|
* +----+-------+---+---+
|
||||||
* </pre>
|
* </pre>
|
||||||
* <p>
|
* <p>
|
||||||
* {@link FrameDecoder} helps you defrag and split the received packets into
|
* {@link FrameDecoder} helps you defrag the received packets into one or more
|
||||||
* one or more meaningful <strong>frames</strong> that could be easily
|
* meaningful <strong>frames</strong> that could be easily understood by the
|
||||||
* understood by the application logic. In case of the example above, your
|
* application logic. In case of the example above, your {@link FrameDecoder}
|
||||||
* {@link FrameDecoder} implementation could defrag the received packets like
|
* implementation could defrag the received packets like the following:
|
||||||
* the following:
|
|
||||||
* <pre>
|
* <pre>
|
||||||
* +-----+-----+-----+
|
* +-----+-----+-----+
|
||||||
* | ABC | DEF | GHI |
|
* | ABC | DEF | GHI |
|
||||||
* +-----+-----+-----+
|
* +-----+-----+-----+
|
||||||
* </pre>
|
* </pre>
|
||||||
* <p>
|
* <p>
|
||||||
* The following code shows an example decoder which decodes a frame whose
|
* The following code shows an example handler which decodes a frame whose
|
||||||
* first 4 bytes header represents the length of the frame, excluding the
|
* first 4 bytes header represents the length of the frame, excluding the
|
||||||
* header.
|
* header.
|
||||||
* <pre>
|
* <pre>
|
||||||
@ -84,6 +82,7 @@ import org.jboss.netty.channel.SimpleChannelHandler;
|
|||||||
* ======================
|
* ======================
|
||||||
*
|
*
|
||||||
* public class IntegerHeaderFrameDecoder extends FrameDecoder {
|
* public class IntegerHeaderFrameDecoder extends FrameDecoder {
|
||||||
|
*
|
||||||
* protected Object decode(ChannelHandlerContext ctx,
|
* protected Object decode(ChannelHandlerContext ctx,
|
||||||
* Channel channel,
|
* Channel channel,
|
||||||
* ChannelBuffer buf) throws Exception {
|
* ChannelBuffer buf) throws Exception {
|
||||||
|
@ -23,6 +23,9 @@
|
|||||||
package org.jboss.netty.handler.codec.frame;
|
package org.jboss.netty.handler.codec.frame;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* An {@link Exception} which is thrown when the length of the frame
|
||||||
|
* decoded by {@link DelimiterBasedFrameDecoder} is greater than the maximum.
|
||||||
|
*
|
||||||
* @author The Netty Project (netty-dev@lists.jboss.org)
|
* @author The Netty Project (netty-dev@lists.jboss.org)
|
||||||
* @author Trustin Lee (tlee@redhat.com)
|
* @author Trustin Lee (tlee@redhat.com)
|
||||||
*
|
*
|
||||||
@ -34,18 +37,30 @@ public class TooLongFrameException extends Exception {
|
|||||||
|
|
||||||
private static final long serialVersionUID = -1995801950698951640L;
|
private static final long serialVersionUID = -1995801950698951640L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance.
|
||||||
|
*/
|
||||||
public TooLongFrameException() {
|
public TooLongFrameException() {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance.
|
||||||
|
*/
|
||||||
public TooLongFrameException(String message, Throwable cause) {
|
public TooLongFrameException(String message, Throwable cause) {
|
||||||
super(message, cause);
|
super(message, cause);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance.
|
||||||
|
*/
|
||||||
public TooLongFrameException(String message) {
|
public TooLongFrameException(String message) {
|
||||||
super(message);
|
super(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance.
|
||||||
|
*/
|
||||||
public TooLongFrameException(Throwable cause) {
|
public TooLongFrameException(Throwable cause) {
|
||||||
super(cause);
|
super(cause);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user