private void Awake()
    {
        _state    = ORTCPServerState.Disconnected;
        _events   = new Queue <ORTCPEventType>();
        _messages = new Queue <string>();
        _packets  = new Queue <ORSocketPacket>();

        if (listenOn == ORTCPServerStartListen.Awake)
        {
            StartListening(port, listeners);
        }
    }
    public void StopListening()
    {
        _state = ORTCPServerState.Disconnected;

        if (_tcpListener == null)
        {
            return;
        }

        _tcpListener.Stop();
        _tcpListener = null;
    }
    private void ReadData()
    {
        bool endOfStream = false;

        while (!endOfStream)
        {
            if (socketType == ORTCPSocketType.Text)
            {
                String response = null;

                try { response = _reader.ReadLine(); } catch (Exception e) { e.ToString(); }

                if (response != null)
                {
                    _events.Enqueue(ORTCPEventType.DataReceived);

                    _messages.Enqueue(response);
                }
                else
                {
                    endOfStream = true;
                }
            }
            else if (socketType == ORTCPSocketType.Binary)
            {
                byte[] bytes = new byte[bufferSize];

                int bytesRead = _stream.Read(bytes, 0, bufferSize);

                if (bytesRead == 0)
                {
                    endOfStream = true;
                }
                else
                {
                    _events.Enqueue(ORTCPEventType.DataReceived);

                    _packets.Enqueue(new ORSocketPacket(bytes, bytesRead));
                }
            }
        }

        _state = ORTCPServerState.Disconnected;

        _tcpListener.Stop();

        _events.Enqueue(ORTCPEventType.Disconnected);
    }
    // Private

    private void AcceptTcpClientCallback(IAsyncResult ar)
    {
        TcpListener tcpListener = (TcpListener)ar.AsyncState;

        _client = tcpListener.EndAcceptTcpClient(ar);

        _stream = _client.GetStream();
        _reader = new StreamReader(_stream);
        _writer = new StreamWriter(_stream);

        _state = ORTCPServerState.Connected;

        _readThread = new Thread(ReadData);
        _readThread.IsBackground = true;
        _readThread.Start();

        _events.Enqueue(ORTCPEventType.Connected);
    }
    public void StartListening(int port, GameObject[] listeners)
    {
        print("[TCPServer] Start Listening: " + port);
        if (_state == ORTCPServerState.Listening)
        {
            return;
        }

        this.port      = port;
        this.listeners = listeners;

        _state = ORTCPServerState.Listening;

        _messages.Clear();
        _events.Clear();

        _tcpListener = new TcpListener(IPAddress.Any, port);
        _tcpListener.Start();
        _tcpListener.BeginAcceptTcpClient(new AsyncCallback(AcceptTcpClientCallback), _tcpListener);
    }
    public void Disconnect()
    {
        print("[TCPServer] Server Disconnecting");
        _state = ORTCPServerState.Disconnected;

        try { if (_reader != null)
              {
                  _reader.Close();
              }
        } catch (Exception e) { e.ToString(); }
        try { if (_writer != null)
              {
                  _writer.Close();
              }
        } catch (Exception e) { e.ToString(); }
        try { if (_client != null)
              {
                  _client.Close();
              }
        } catch (Exception e) { e.ToString(); }
    }