/// <summary> /// Send a message to a specific client /// </summary> /// <param name="clientPublicToken"></param> /// <param name="name"></param> /// <param name="contents"></param> public void SendMessage(string clientPublicToken, string tip, object content) { if (string.IsNullOrEmpty(clientPublicToken)) { throw new ArgumentNullException("clientPublicToken"); } if (content == null) { throw new ArgumentNullException("content"); } lock (state) { if (!publicClients.ContainsKey(clientPublicToken)) { throw CometException.CometClientDoesNotExistException(); } InProcCometClient cometClient = publicClients[clientPublicToken]; CometMessage message = new CometMessage(); message.Content = content; message.Tip = tip; message.MessageId = cometClient.NextMessageId; cometClient.NextMessageId++; cometClient.Messages.Add(message.MessageId, message); } }
/// <summary> /// Get the client from the state provider /// </summary> /// <param name="clientPrivateToken"></param> /// <returns></returns> public CometClient GetCometClient(string clientPrivateToken) { // Debug.WriteLine("目前有几个客户端连接"+this.publicClients.Count); if (!this.privateClients.ContainsKey(clientPrivateToken)) { throw CometException.CometClientDoesNotExistException(); } // return the client private token return(this.privateClients[clientPrivateToken].CometClient); }
/// <summary> /// Remove an idle client from the memory /// </summary> /// <param name="clientPrivateToken"></param> public void KillIdleCometClient(string clientPrivateToken) { if (!this.privateClients.ContainsKey(clientPrivateToken)) { throw CometException.CometClientDoesNotExistException(); } // get the client InProcCometClient ipCometClient = this.privateClients[clientPrivateToken]; // and remove the dictionarys this.privateClients.Remove(ipCometClient.CometClient.PrivateToken); this.publicClients.Remove(ipCometClient.CometClient.PublicToken); Debug.WriteLine(ipCometClient.CometClient.PublicToken + " has been removed from memmory."); }
public CometMessage[] GetMessages(string clientPrivateToken, long lastMessageId) { if (string.IsNullOrEmpty(clientPrivateToken)) { throw new ArgumentNullException("clientPrivateToken"); } lock (state) { if (!privateClients.ContainsKey(clientPrivateToken)) { throw CometException.CometClientDoesNotExistException(); } InProcCometClient cometClient = privateClients[clientPrivateToken]; List <long> toDelete = new List <long>(); List <long> toReturn = new List <long>(); // 根据lastMessageId 机制可以得到离线消息 foreach (long key in cometClient.Messages.Keys) { if (key <= lastMessageId) { toDelete.Add(key); } else { toReturn.Add(key); } } foreach (long key in toDelete) { cometClient.Messages.Remove(key); } List <CometMessage> cometMessages = new List <CometMessage>(); foreach (long key in toReturn) { cometMessages.Add(cometClient.Messages[key]); } return(cometMessages.ToArray()); } }