private void Read(ISocketListener socketListener, byte[] buffer, IHandler handler)
        {
            if (!socketListener.IsListening)
                return;

            socketListener.Receive(buffer, readBytes =>
            {
                if (readBytes.Length <= 0)
                {
                    _logger.Debug("Client disconnected from {0}:{1}", socketListener.RemoteIpAddress, socketListener.RemotePort);
                    socketListener.Close(_logger, handler);
                    return;
                }

                handler.Receive(readBytes);

                Read(socketListener, buffer, handler);
            }, ex => socketListener.Close(_logger, handler, ex.GetWebSocketErrorCode()));
        }
        public void Stop()
        {
            DoStop();
            if (_sessions != null)
            {
                foreach (ISession session in _sessions)
                {
                    session.Close();
                }

                _sessions.Clear();
            }

            if (_socketListener != null)
            {
                _socketListener.Close();
            }
        }
        public void HandleRequest(ISocketListener socketListener)
        {
            var buffer = new byte[ReadSize];

            socketListener.Receive(buffer, readBytes =>
            {
                if (readBytes.Length <= 0)
                {
                    _logger.Debug("Client disconnected from {0}:{1}", socketListener.RemoteIpAddress, socketListener.RemotePort);
                    socketListener.Dispose();
                    return;
                }

                var requestString = Encoding.UTF8.GetString(readBytes);

                var request = _requestParser.Parse(requestString);

                var handler = _handshakeNegotiator.Negotiate(request, m => socketListener.Send(m, _logger));

                Read(socketListener, buffer, handler);
            }, ex => socketListener.Close(ex.GetErrorResponse(), _logger));
        }