//Broadcast the message to the recipients

        public void Broadcast(Chat.Packet packet, Chat.Users recipients)
        {
            //If the dataset is Nothing, broadcast to everyone
            if (recipients == null)
            {
                foreach (DictionaryEntry c in AllClients)
                {
                    //Broadcast the message to all users
                    ((Server)c.Value).SendMessage(packet);
                }
            }
            else
            {
                //Broadcast to selected recipients
                foreach (DictionaryEntry c in AllClients)
                {
                    foreach (Chat.User usr in recipients.List)
                    {
                        if (((Server)c.Value)._clientName == usr.Name)
                        {
                            //Send message to the recipient
                            ((Server)c.Value).SendMessage(packet);

                            //---log it locally
                            //Console.WriteLine("sending -----> " & message)
                            break; // TODO: might not be correct. Was : Exit For
                        }
                    }
                }
            }
        }
        public void ReceiveMessage(IAsyncResult ar)
        {
            //Read from client
            int bytesRead = 0;

            try
            {
                if (_client.Connected == true)
                {
                    lock (_client.GetStream())
                    {
                        bytesRead = _client.GetStream().EndRead(ar);
                    }

                    //Client disconnected
                    if (bytesRead < 1)
                    {
                        sessionEnded(_clientIP);
                        return;
                    }
                    else
                    {
                        //The message received from the remote client
                        string messageReceived = System.Text.Encoding.ASCII.GetString(data, 0, bytesRead);

                        // Deserialize the packet
                        Chat.Packet packet = new Chat.Packet();
                        packet = (Chat.Packet)Chat.Deserialize(messageReceived, packet.GetType());

                        Chat.Users recipients = new Chat.Users();
                        switch (packet.ID)
                        {
                        case Chat.MSGType.Join:


                            Chat.User usr = (Chat.User)packet.Content;
                            _clientName = usr.Name;

                            // Add the user set to receive a full list of user
                            recipients.List.Add(usr);

                            Chat.Users usrs = new Chat.Users();
                            foreach (DictionaryEntry c in AllClients)
                            {
                                Chat.User u = new Chat.User();
                                u.Name = ((Server)c.Value)._clientName;
                                usrs.List.Add(u);
                            }

                            Chat.Packet usersListPacket = new Chat.Packet();
                            usersListPacket.ID      = Chat.MSGType.ClientList;
                            usersListPacket.Content = usrs;


                            //Send the full user list to the user that just signed on
                            Broadcast(usersListPacket, recipients);

                            //Rebroadcast the original message to everyone that this user is online
                            Broadcast(packet, null);

                            break;

                        case Chat.MSGType.Message:
                            Chat.Message message = (Chat.Message)packet.Content;

                            foreach (string recipient in message.Reciptients)
                            {
                                Chat.User u = new Chat.User();
                                u.Name = recipient;
                                recipients.List.Add(u);
                            }

                            //Send the message to the recipients
                            Broadcast(packet, recipients);
                            break;

                        default:

                            break;
                        }
                    }

                    //Continue reading from the client
                    lock (_client.GetStream()) {
                        _client.GetStream().BeginRead(data, 0, Convert.ToInt32(_client.ReceiveBufferSize), ReceiveMessage, null);
                    }
                }
            } catch (Exception ex) {
                sessionEnded(_clientIP);
            }
        }