// Разрегистрация клиента 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); }
/// <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); }