|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
Basic unit of transport in Net4j.
A buffer is well prepared for the usage with asynchronous IChannel
s but can also be used with pure
SocketChannel
s. All methods of IBuffer
are non-blocking.
Usually buffers are obtained from a IBufferProvider
. Buffers can be accessed, passed around and finally
released
to their original provider. The capacity of a buffer is determined by its provider.
In addition to its payload data each buffer contains an internal header of four bytes, two of them representing a
channel identifier the other two of them denoting the length of the payload data. The payload data may be accessed
through a ByteBuffer
.
This interface is not intended to be implemented by clients.
An example for putting values into a buffer and writing it to a SocketChannel
:
// Obtain a fresh buffer Buffer buffer = bufferProvider.getBuffer(); // Start filling the buffer for channelID 4711 ByteBuffer byteBuffer = buffer.startPutting(4711); byteBuffer.putDouble(15.47); // Write the contents of the Buffer to a // SocketChannel without blocking while (!buffer.write(socketChannel)) { // Do something else }An example for reading a buffer from a
SocketChannel
and getting values from it:
// Obtain a fresh buffer Buffer buffer = bufferProvider.getBuffer(); // Read the contents of the Buffer from a SocketChannel without blocking ByteBuffer byteBuffer; while ((byteBuffer = buffer.startGetting(socketChannel)) == null) { // Do something else } // Access the contents of the buffer and release it to its provider double value = byteBuffer.getDouble(); buffer.release();
IBufferProvider
,
IChannel.sendBuffer(IBuffer)
,
IChannel.setReceiveHandler(IBufferHandler)
,
IBufferHandler.handleBuffer(IBuffer)
Field Summary | |
---|---|
static short |
HEADER_SIZE
|
static short |
MAX_CHANNEL
|
static short |
MIN_CHANNEL
|
static short |
NO_CHANNEL
Possible argument value of startPutting(short) and possible return value of getChannelID() that
indicates that this buffer is not intended to be passed to a SocketChannel . |
Method Summary | |
---|---|
void |
clear()
Turns the state of this buffer from any state into INITIAL . |
void |
flip()
Turns the state of this buffer from PUTTING into GETTING . |
String |
formatContent(boolean showHeader)
|
IBufferProvider |
getBufferProvider()
Returns the IBufferProvider that has provided this buffer and that this buffer will be returned to when its
release() method is called. |
ByteBuffer |
getByteBuffer()
Returns the ByteBuffer that can be used for putting or getting data. |
short |
getCapacity()
Returns the capacity of this buffer. |
short |
getChannelID()
Returns the channel index value stored in the header of this buffer. |
IErrorHandler |
getErrorHandler()
|
BufferState |
getState()
Returns the internal state of this buffer. |
boolean |
isEOS()
Returns the End Of Stream flag to indicate whether this buffer is the last buffer in a stream of buffers. |
void |
release()
Releases this buffer to its original IBufferProvider . |
void |
setEOS(boolean eos)
Sets the End Of Stream flag to indicate whether this buffer is the last buffer in a stream of buffers. |
void |
setErrorHandler(IErrorHandler errorHandler)
|
ByteBuffer |
startGetting(SocketChannel socketChannel)
Tries to read a ByteBuffer from a SocketChannel that can be used for getting data. |
ByteBuffer |
startPutting(short channelID)
Returns a ByteBuffer that can be used for putting data. |
boolean |
write(SocketChannel socketChannel)
Tries to write the data of this buffer to a SocketChannel . |
Field Detail |
---|
static final short NO_CHANNEL
startPutting(short)
and possible return value of getChannelID()
that
indicates that this buffer is not intended to be passed to a SocketChannel
.
static final short MIN_CHANNEL
static final short MAX_CHANNEL
static final short HEADER_SIZE
Method Detail |
---|
IBufferProvider getBufferProvider()
IBufferProvider
that has provided this buffer and that this buffer will be returned to when its
release()
method is called.
short getChannelID()
short getCapacity()
The capacity of this buffer is equal to the capacity
of the
IBufferProvider
that has provided this buffer.
BufferState getState()
ByteBuffer startGetting(SocketChannel socketChannel) throws IllegalStateException, IOException
ByteBuffer
from a SocketChannel
that can be used for getting data.
This method is non-blocking and it can be necessary to repeatedly call it. If it was not possible to read a
complete header from the SocketChannel
null
is returned and the state of this buffer is
READING_HEADER
. If it was not possible to read a complete body from the
SocketChannel
null
is returned and the state of this buffer is
READING_BODY
.
If a ByteBuffer
is returned it may only be used for getting data. It is left to the
responsibility of the caller that only the following methods of that ByteBuffer
are used:
ByteBuffer.get()
ByteBuffer.get(byte[])
ByteBuffer.get(int)
ByteBuffer.get(byte[], int, int)
ByteBuffer.getChar()
ByteBuffer.getChar(int)
ByteBuffer.getDouble()
ByteBuffer.getDouble(int)
ByteBuffer.getFloat()
ByteBuffer.getFloat(int)
ByteBuffer.getInt()
ByteBuffer.getInt(int)
ByteBuffer.getLong()
ByteBuffer.getLong(int)
ByteBuffer.getShort()
ByteBuffer.getShort(int)
Buffer.position()
, Buffer.limit()
and
Buffer.capacity()
socketChannel
- The socketChannel
to read the ByteBuffer
from.
ByteBuffer
that can be used for getting data if it was possible to completely read the data from
the given SocketChannel
, null
otherwise.
IllegalStateException
- If the state of this buffer is not INITIAL
,
READING_HEADER
or READING_BODY
.
IOException
- If the SocketChannel
has been closed or discovers other I/O problems.ByteBuffer startPutting(short channelID) throws IllegalStateException
ByteBuffer
that can be used for putting data.
Turns the state
of this buffer into PUTTING
.
The returned ByteBuffer
may only be used for putting data. It is left to the responsibility of
the caller that only the following methods of that ByteBuffer
are used:
ByteBuffer.put(byte)
ByteBuffer.put(byte[])
ByteBuffer.put(ByteBuffer)
ByteBuffer.put(int, byte)
ByteBuffer.put(byte[], int, int)
ByteBuffer.putChar(char)
ByteBuffer.putChar(int, char)
ByteBuffer.putDouble(double)
ByteBuffer.putDouble(int, double)
ByteBuffer.putFloat(float)
ByteBuffer.putFloat(int, float)
ByteBuffer.putInt(int)
ByteBuffer.putInt(int, int)
ByteBuffer.putLong(long)
ByteBuffer.putLong(int, long)
ByteBuffer.putShort(short)
ByteBuffer.putShort(int, short)
Buffer.position()
, Buffer.limit()
and
Buffer.capacity()
channelID
- The index of an IChannel
that this buffer is intended to be passed to later or NO_CHANNEL
.
ByteBuffer
that can be used for putting data.
IllegalStateException
- If the state of this buffer is not INITIAL
(PUTTING
is allowed but meaningless if and only if the given channelID
is equal to the
existing channelID
of this buffer).boolean write(SocketChannel socketChannel) throws IllegalStateException, IOException
SocketChannel
.
This method is non-blocking and it can be necessary to repeatedly call it. If it was not possible to completely
write the data to the SocketChannel
false
is returned and the state of this buffer
remains WRITING
.
socketChannel
- The socketChannel
to write the data to.
true
if it was possible to completely write the data to the SocketChannel
,
false
otherwise.
IllegalStateException
- If the state of this buffer is not PUTTING
or WRITING
.
IOException
- If the SocketChannel
has been closed or discovers other I/O problems.void flip() throws IllegalStateException
PUTTING
into GETTING
.
IllegalStateException
- If the state of this buffer is not PUTTING
.ByteBuffer getByteBuffer() throws IllegalStateException
ByteBuffer
that can be used for putting or getting data.
IllegalStateException
- If the state of this buffer is not PUTTING
or GETTING
.boolean isEOS()
void setEOS(boolean eos)
void release()
IBufferProvider
.
void clear()
INITIAL
.
String formatContent(boolean showHeader)
IErrorHandler getErrorHandler()
void setErrorHandler(IErrorHandler errorHandler)
|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |