org.xsocket.stream
Interface IDataHandler

Package class diagram package IDataHandler
All Superinterfaces:
IHandler
All Known Implementing Classes:
HandlerChain

public interface IDataHandler
extends IHandler

Reads and processes the incoming data. This method will be called each time when data is available. Because this depends on the underlying tcp protocol, it is not predictable how often and when this method will be call. Furthermore the call of this method is independent of the received data size. The data handler is responsible to extract the application specific data packages (like HTTP request or SMTP commands) based on the received data. Calling a read method on the given connection instance like connection.readLong() or connection.readStringByDelimiter(…) will throw a BufferUnderflowException exception if the required data isn’t available .

 public final class MyHandler implements IDataHandler, IConnectionScoped {
   ...
   public boolean onData(INonBlockingConnection connection) throws IOException, BufferUnderflowException, MaxReadSizeExceededException {
        ...
      // BufferUnderflowException will been thrown if delimiter hasn`t been found. 
      // A MaxReadSizeExceededException will be thrown if the max read size has been exceeded. Unhandling this exception causes 
      // that the server closes the underlying connection 
      String command = connection.readStringByDelimiter("\r\n", "US-ASCII", 5000);
      ...
      connection.write(resonse, "US-ASCII");
      return true;
   }
 } 
 


Method Summary
 boolean onData(INonBlockingConnection connection)
          processes the incomming data based on the given connection.
 

Method Detail

onData

boolean onData(INonBlockingConnection connection)
               throws java.io.IOException,
                      java.nio.BufferUnderflowException,
                      MaxReadSizeExceededException
processes the incomming data based on the given connection.

Please note, that the onData callback method could also be called for an already closed connection. This occurs when data has been received (and buffered internally) and the connection has been closed by the peer, immediately. In this case the isOpen call within the onData Method will return false. Reading of already received data wouldn`t fail. To detect if a connection has been closed the callback method onDisconnect should be implemented. The correct callback order will be managed by the xSocket.

Parameters:
connection - the underlying connection
Returns:
true for positive result of handling, false for negative result of handling. The return value will be used by the HandlerChain to interrupted the chaining (if result is true)
Throws:
java.io.IOException - If some other I/O error occurs. Throwing this exception causes that the underlying connection will be closed.
java.nio.BufferUnderflowException - if more incoming data is required to process. The BufferUnderflowException will be swallowed by the framework
MaxReadSizeExceededException - if the max read size has been reached (e.g. by calling method INonBlockingConnection.readStringByDelimiter(String, int)). Throwing this exception causes that the underlying connection will be closed.