//sends connect message
        public void SendConnectMessage()
        {
            ConnectMessagePacket connectPacket = new ConnectMessagePacket("user");
            MemoryStream         msgStream     = new MemoryStream();

            formatter.Serialize(msgStream, connectPacket);
            byte[] buffer = msgStream.GetBuffer();
            writer.Write(buffer.Length);
            writer.Write(buffer);
            writer.Flush();
            isConnected = true;
        }
        //processes server responce
        private void ProcessServerResponse()
        {
            int numberOfBytes;

            //if connected to server
            while (isConnected == true)
            {
                //read data from server and deserialize
                if ((numberOfBytes = reader.ReadInt32()) != 0)
                {
                    byte[]       buffer  = reader.ReadBytes(numberOfBytes);
                    MemoryStream _stream = new MemoryStream(buffer);
                    Packet       packet  = formatter.Deserialize(_stream) as Packet;

                    //if packet type is...
                    switch (packet.mPacketType)
                    {
                    //send message to all
                    case PacketType.chatMessage:
                        ChatMessagePacket chatPacket = (ChatMessagePacket)packet;
                        mClientForm.UpdateChatWindow(chatPacket.mSender + ": " + chatPacket.mMessage);
                        break;

                    //send disconnect message to all
                    case PacketType.disconnectMessage:
                        DisconnectMessagePacket disconnectPacket = (DisconnectMessagePacket)packet;
                        mClientForm.UpdateChatWindow(disconnectPacket.mSender + ": has disconnected.");
                        break;

                    //send connect message to all
                    case PacketType.connectMessage:
                        ConnectMessagePacket connectPacket = (ConnectMessagePacket)packet;
                        mClientForm.UpdateChatWindow(connectPacket.mSender + ": has connected.");
                        break;

                    //send private message to user
                    case PacketType.privateMessage:
                        PrivateMessagePacket privateMessagePacket = (PrivateMessagePacket)packet;
                        mClientForm.UpdateChatWindow(privateMessagePacket.mSender + "(" + privateMessagePacket.mReceiver + ")" + " Wispers: " + privateMessagePacket.mMessage);
                        break;
                    }
                }
            }

            reader.Close();
            writer.Close();
            tcpClient.Close();
        }
        //client method sends data from server program to client program
        private void ClientMethod(Client client)
        {
            Packet packet;

            try
            {
                //while client is reading data
                while ((packet = client.Read()) != null)
                {
                    switch (packet.mPacketType)
                    {
                    //send message to everyone
                    case PacketType.chatMessage:
                        ChatMessagePacket chatMessagePacket = (ChatMessagePacket)packet;
                        foreach (Client onlineClient in clients.Values)
                        {
                            onlineClient.Send(packet);
                        }
                        break;

                    //send disconnect message to everyone
                    case PacketType.disconnectMessage:
                        DisconnectMessagePacket disconnectPacket = (DisconnectMessagePacket)packet;
                        foreach (Client onlineClient in clients.Values)
                        {
                            onlineClient.Send(packet);
                        }
                        break;

                    //send connect message
                    case PacketType.connectMessage:
                        ConnectMessagePacket connectMessage = (ConnectMessagePacket)packet;
                        foreach (Client onlineClient in clients.Values)
                        {
                            onlineClient.Send(packet);
                        }
                        break;

                    //send private message to one user
                    case PacketType.privateMessage:
                        PrivateMessagePacket privateMessage = (PrivateMessagePacket)packet;
                        for (int i = 0; i < clients.Count(); i++)
                        {
                            if (i == privateMessage.mReceiver)
                            {
                                clients[i].Send(packet);
                            }
                        }
                        break;

                    default:
                        break;
                    }
                }
            }
            //if try catch fails send error message
            catch (Exception e)
            {
                Console.WriteLine("Error:" + e.Message);
            }
            //close client and remove from concurrent bag
            finally
            {
                for (int i = 0; i < clients.Count(); i++)
                {
                    //clients[i].Close();
                    clients.TryRemove(i, out client);
                }
            }
        }