protected final boolean initTcp()
    {
        boolean successful = true;

        //if the custom reader/writer are null, create default
        boolean hasDataReader = this.dataReader != null;
        boolean hasDataWriter = this.dataWriter != null;

        if (!hasDataReader && !hasDataWriter)
        {
            this.usingCustomSerialization = false;
            dataReader = new ReadObjectDataReader();
            dataWriter = new WriteObjectDataWriter();
            LOGGER.trace("Using default Serialization for TCP reader and writer");
            successful = true;
        }
        else if (hasDataReader && hasDataWriter)
        {
            LOGGER.trace("Using Custom serialization for Tcp reader and writer");
            successful = true;
        }
        else if (hasDataReader && !hasDataWriter)
        {
            LOGGER.warn("A custom DataReader was set but missing custom DataWriter");
            successful = false;
        }
        else if (!hasDataReader && hasDataWriter)
        {
            LOGGER.warn("A custom DataWriter was set but missing custom DataReader");
            successful = false;
        }

        if (this.tcpSocket == null)
        {
            successful = false;
        }
        else
        {
            this.socketAddress = this.tcpSocket.getRemoteSocketAddress();
        }

        this.ioTcpReadRunnable = new IoTcpReadRunnable<MessageType>(this, new RunnableEventListener()
        {
            @Override
            public void onRunnableClosed(DisconnectState disconnectState)
            {
                LOGGER.trace("IoTcpReadRunnable closed {}", disconnectState);
                disconnect();
                ioTcpReadRunnable = null;
            }
        }, dataReader, tcpSocket);
        this.ioTcpWriteRunnable = new IoTcpWriteRunnable<MessageType>(new RunnableEventListener()
        {
            @Override
            public void onRunnableClosed(DisconnectState disconnectState)
            {
                LOGGER.trace("ioTcpWriteRunnable closed {}", disconnectState);
                disconnect();
                ioTcpWriteRunnable = null;
            }
        }, dataWriter, tcpSocket);

        return successful;
    }