/// <summary>
        /// Потеря соединения
        /// </summary>
        /// <param name="c"></param>
        private void ConnectionLostHandler(SBRemoteClient c)
        {
            if (c.Name != null)
            {
                this.SendToAll(new MsgChatMessage()
                {
                    Text = c.Name + " соединение потеряно"
                });

                if (c.State != KnownClientState.InGame)
                {
                    this.SendToAll(new MsgRemoveKnownClient()
                    {
                        Id = c.Id
                    });

                    using (_knownClients.Write())
                    {
                        _knownClients.Object.Remove(c.Id);
                    }
                }
            }
            else
            {
                using (_unnamedClients.Write())
                {
                    _unnamedClients.Object.Remove(c);
                }
            }
        }
        /// <summary>
        /// Начало игры
        /// </summary>
        /// <param name="c"></param>
        /// <param name="opponentId"></param>
        /// <param name="password"></param>
        private void BeginGameHandler(SBRemoteClient c, Guid opponentId, string password)
        {
            SBRemoteClient opponent;

            if (c.State == KnownClientState.Free || c.State == KnownClientState.Ready)
            {
                using (_knownClients.Read())
                {
                    if (!_knownClients.Object.TryGetValue(opponentId, out opponent))
                    {
                        opponent = null;
                    }
                }

                if (opponent != null)
                {
                    if (opponent.Password == password)
                    {
                        c.SetState(KnownClientState.InGame);
                        opponent.SetState(KnownClientState.InGame);

                        var g = new SBGame(c, opponent);
                        g.OnScoreChanged += gc => GameScoreChangedHalder(gc);
                        g.OnGameFinished += () => GameFinishedHandler(g);

                        using (_games.Write())
                        {
                            _games.Object.Add(g.Id, g);
                        }

                        this.SendToAll(new MsgNewGame()
                        {
                            Id      = g.Id,
                            PlayerA = g.PlayerA,
                            PlayerB = g.PlayerB
                        });
                    }
                    else
                    {
                        c.Send(new MsgChatMessage()
                        {
                            Text = "Неверный пароль!"
                        });
                    }
                }
            }
        }
        /// <summary>
        /// Создание нового соединения
        /// </summary>
        /// <param name="cnn"></param>
        private void NewConnectionHandler(Connection cnn)
        {
            var c = new SBRemoteClient(cnn);

            c.OnRegisterName   += name => RegisterNameHandler(c);
            c.OnRestoreSession += id => RestoreSessionHandler(id, cnn);
            c.OnChatMessage    += msg => ChatMessageHandler(c, msg);
            c.OnStateChanged   += st => StateChangedHandler(c, st);
            c.OnBeginGame      += (opponentId, pwd) => BeginGameHandler(c, opponentId, pwd);
            c.OnConnectionLost += () => ConnectionLostHandler(c);
            c.Start();

            using (_unnamedClients.Write())
            {
                _unnamedClients.Object.AddLast(c);
            }

            OnNewConnection(c, cnn);
        }