Class NioSender

  • All Implemented Interfaces:
    DataSender

    public class NioSender
    extends AbstractSender
    This class is NOT thread safe and should never be used with more than one thread at a time. This is a state machine, handled by the process method. States are:
    • NOT_CONNECTED -> connect() -> CONNECTED
    • CONNECTED -> setMessage() -> READY TO WRITE
    • READY_TO_WRITE -> write() -> READY TO WRITE | READY TO READ
    • READY_TO_READ -> read() -> READY_TO_READ | TRANSFER_COMPLETE
    • TRANSFER_COMPLETE -> CONNECTED
    Thread-safety / synchronisation is managed by ParallelNioSender
    • Field Detail

      • sm

        protected static final StringManager sm
        String manager for this class.
      • selector

        protected java.nio.channels.Selector selector
        The NIO selector for multiplexing channels.
      • socketChannel

        protected java.nio.channels.SocketChannel socketChannel
        The TCP socket channel.
      • dataChannel

        protected java.nio.channels.DatagramChannel dataChannel
        The UDP datagram channel.
      • readbuf

        protected java.nio.ByteBuffer readbuf
        Buffer for reading from the channel.
      • writebuf

        protected java.nio.ByteBuffer writebuf
        Buffer for writing to the channel.
      • current

        protected volatile byte[] current
        Current message being processed.
      • ackbuf

        protected final XByteBuffer ackbuf
        Acknowledgment buffer.
      • remaining

        protected int remaining
        Number of remaining bytes to send.
      • complete

        protected boolean complete
        Flag indicating send completion.
      • connecting

        protected boolean connecting
        Flag indicating connection in progress.
    • Constructor Detail

      • NioSender

        public NioSender()
        Default constructor.
    • Method Detail

      • process

        public boolean process​(java.nio.channels.SelectionKey key,
                               boolean waitForAck)
                        throws java.io.IOException
        State machine to send data.
        Parameters:
        key - The key to use
        waitForAck - Wait for an ack
        Returns:
        true if the processing was successful
        Throws:
        java.io.IOException - An IO error occurred
      • read

        protected boolean read()
                        throws java.io.IOException
        Reads acknowledgment data from the channel.
        Returns:
        true if there is more data to read
        Throws:
        java.io.IOException - If an I/O error occurs
      • write

        protected boolean write()
                         throws java.io.IOException
        Writes the current message to the channel.
        Returns:
        true if the message was fully written
        Throws:
        java.io.IOException - If an I/O error occurs
      • connect

        public void connect()
                     throws java.io.IOException
        Description copied from interface: DataSender
        Connect.
        Throws:
        java.io.IOException - when an error occurs
      • disconnect

        public void disconnect()
        Description copied from interface: DataSender
        Disconnect.
      • reset

        public void reset()
        Resets the sender state for reuse.
      • setMessage

        public void setMessage​(byte[] data)
                        throws java.io.IOException
        Send message.
        Parameters:
        data - ChannelMessage
        Throws:
        java.io.IOException - if an error occurs
      • setMessage

        public void setMessage​(byte[] data,
                               int offset,
                               int length)
                        throws java.io.IOException
        Sets the message to be sent.
        Parameters:
        data - The message data
        offset - The offset in the data array
        length - The length of the data to send
        Throws:
        java.io.IOException - If an I/O error occurs
      • getMessage

        public byte[] getMessage()
        Returns the current message being sent.
        Returns:
        the current message byte array
      • isComplete

        public boolean isComplete()
        Checks if the send operation is complete.
        Returns:
        true if the send is complete
      • getSelector

        public java.nio.channels.Selector getSelector()
        Returns the NIO selector.
        Returns:
        the selector
      • setSelector

        public void setSelector​(java.nio.channels.Selector selector)
        Sets the NIO selector.
        Parameters:
        selector - the selector
      • setComplete

        public void setComplete​(boolean complete)
        Sets the completion flag.
        Parameters:
        complete - the completion status