Esempio n. 1
0
        /// <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);
            }
        }
Esempio n. 2
0
        /// <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.");
        }
Esempio n. 3
0
        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());
            }
        }
Esempio n. 4
0
        public void InitializeClient(CometClient cometClient)
        {
            if (cometClient == null)
            {
                throw new ArgumentNullException(nameof(cometClient));
            }

            lock (state)
            {
                if (publicClients.ContainsKey(cometClient.PublicToken) || privateClients.ContainsKey(cometClient.PrivateToken))
                {
                    throw CometException.CometClientAlreadyExistsException();
                }

                var inProcCometClient = new InProcCometClient()
                {
                    CometClient = cometClient
                };
                publicClients.Add(cometClient.PublicToken, inProcCometClient);
                privateClients.Add(cometClient.PrivateToken, inProcCometClient);
            }
        }