// Разрегистрация клиента
        public static void UnregisterClient(CometAsyncState client, bool reload = false)
        {
            WriteLog($"Start UnregisterClient by CometAsyncState -> ClientGuid: {client.ClientGuid} Reload: {reload}");
            var m = new CometMessage
            {
                Message    = "unregister",
                UserName   = client.CurrentContext.User.Identity.Name,
                Status     = 1,
                Reload     = reload ? 1 : 0,
                ClientGuid = client.ClientGuid
            };

            lock (SyncLock)
            {
                //Очередь сообщений очищаем, клиент уже не хочет ничего принимать
                if (null != client.Messages)
                {
                    client.Messages.Clear();
                }

                client.AddMessage(m);

                // Клиент будет удален из списка после отправки последнего сообщения ему
                client.Tries = 0;
            }

            if (client.Id > 0)
            {
                OnNotifyClients(client, null, 1);
            }

            Process();
        }
            /// <summary>
            ///     Добавить сообщение в очередь для клиентов удовлетворяющих заданному условию
            /// </summary>
            /// <param name="m">Сообщение</param>
            /// <param name="filter">Фильтр для определения клиентов</param>
            public static void AddMessage(CometMessage m, Predicate <CometAsyncState> filter)
            {
                WriteLog("Start AddMessage to clients by filter");
                lock (SyncLock)
                {
                    foreach (var clientState in Connections)
                    {
                        if (filter(clientState))
                        {
                            clientState.AddMessage(m);
                        }
                    }
                }

                WriteLog("End AddMessage to clients by filter");
            }
        // Разрегистрация клиента
        public static void UnregisterClient(string clientGuid, bool serverCompeteRequest = true)
        {
            WriteLog("Start UnregisterClient by Guid -> " + clientGuid);

            var m = new CometMessage
            {
                Message    = "unregister",
                UserName   = HttpContext.Current == null ? "noname" : HttpContext.Current.User.Identity.Name,
                Status     = 1,
                ClientGuid = clientGuid
            };

            lock (SyncLock)
            {
                // Клиент будет удален из списка после отправки последнего сообщения ему
                var client = Connections.FirstOrDefault(x => x.ClientGuid == clientGuid);

                if (client != null)
                {
                    //Очередь сообщений очищаем, клиент уже не хочет ничего принимать
                    if (null != client.Messages)
                    {
                        client.Messages.Clear();
                    }

                    //если требуется закрыть соединение с сервера
                    if (serverCompeteRequest)
                    {
                        client.AddMessage(m);
                    }

                    // Клиент будет удален из списка после отправки последнего сообщения ему
                    client.Tries = 0;
                }
            }

            OnNotifyClients(null, clientGuid, 1);
            Process();
            WriteLog("End UnregisterClient by Guid -> " + clientGuid);
        }
Example #4
0
        /// <summary>
        ///     Добавить сообщение в очередь
        /// </summary>
        /// <param name="m"></param>
        public int AddMessage(CometMessage m)
        {
            //Клиент уже разрегистрирован
            if (Tries < 1)
            {
                return(-1);
            }
            CometServer.WriteLog("Start AddMessage");

            if (null == Messages)
            {
                Messages = new Queue <CometMessage>();
            }

            if (Messages.Count < 1)
            {
                Tries = MaxTries;
            }

            //Если в очереди уже есть сообщение для обновления списка пользователей, то имеющееся сообщение можно просто обновить

            if (m.isUserList())
            {
                var en = Messages.GetEnumerator();
                while (en.MoveNext())
                {
                    if (en.Current.isUserList())
                    {
                        CometServer.WriteLog($"AddMessage: {m.Message}");
                        en.Current.Message = m.Message;
                        return(Messages.Count);
                    }
                }
            }

            CometServer.WriteLog($"AddMessage: {m.Message}");
            Messages.Enqueue(m);
            CometServer.WriteLog("End AddMessage");
            return(Messages.Count);
        }
            /// <summary>
            ///     Добавить сообщение в очередь для клиентов с указанным guid
            /// </summary>
            /// <param name="m">Сообщение</param>
            /// <param name="clientGuid">IP- страницы</param>
            public static void AddMessage(CometMessage m, string clientGuid = "")
            {
                WriteLog("Start AddMessage to clients by guid [" + clientGuid + "]");
                if (clientGuid == "")
                {
                    Predicate <CometAsyncState> f = client =>
                    {
                        return(clientGuid == "" || client.ClientGuid == clientGuid);
                    };
                    AddMessage(m, f);
                }
                else
                {
                    var client = Connections.FirstOrDefault(c => c.ClientGuid == clientGuid);
                    if (client != null)
                    {
                        client.AddMessage(m);
                    }
                }

                WriteLog("End AddMessage to clients by guid [" + clientGuid + "]");
            }
 /// <summary>
 ///     Отправка сообщения
 /// </summary>
 /// <param name="message">Сообщение</param>
 /// <param name="filter">Фильтр клиентов</param>
 public static void PushMessage(CometMessage message, Predicate <CometAsyncState> filter)
 {
     WriteLog($"Start PushMessage -> message: {message.Message}");
     MsgProcessor.AddMessage(message, filter);
     WriteLog("End PushMessage");
 }
        // Возвращаем сообщение каждому подключенному клиенту

        /*
         * public static void PushMessage(CometMessage pushMessage, string clientGuid = "")
         * {
         *  lock (_lock)
         *  {
         *      // Пробегаем по списку всех подключенных клиентов
         *      foreach (var clientState in _clientStateList)
         *      {
         *          if (clientState.CurrentContext.Session != null)
         *          {
         *              if (clientGuid != "" && clientState.ClientGuid != clientGuid) continue;
         *              // И пишем в выходной поток текущее сообщение
         *              clientState.CurrentContext.Response.Write(pushMessage.IsV4Script
         *                  ? pushMessage.Message
         *                  : pushMessage.Serialize());
         *              // После чего завершаем запрос - вот именно после этого результаты
         *              // запроса пойдут ко всем подключенным клиентам
         *              clientState.CompleteRequest();
         *          }
         *      }
         *  }
         * }*/

        /// <summary>
        ///     Отправка сообщения
        /// </summary>
        /// <param name="message">Сообщение</param>
        /// <param name="clientGuid">Идентификатор страницы</param>
        public static void PushMessage(CometMessage message, string clientGuid = "")
        {
            MsgProcessor.AddMessage(message, clientGuid);
        }