private static void RecServerFromLB(NetworkStream networkStream)
        {
            byte[]         buffer = new byte[30];
            string         dataFromClient;
            IList <string> msgSplit;
            string         serverIp;
            int            port;

            try
            {
                while (true)
                {
                    networkStream.Read(buffer, 0, 30);
                    dataFromClient = Encoding.ASCII.GetString(buffer);
                    dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));
                    msgSplit       = dataFromClient.Split(':');
                    serverIp       = msgSplit[0];
                    port           = Int32.Parse(msgSplit[1]) + 2;
                    log.Write("Starting Listening from Server " + serverIp + ":" + port);
                    TcpClient serverSocket = new TcpClient();
                    serverSocket.Connect(serverIp, port);
                    HandleServer server = new HandleServer {
                        ServerID = Interlocked.Increment(ref sereverounter), ServerSocket = serverSocket, Sender = true, Port = port, ServerIP = serverIp
                    };
                    server.StartServer();
                    serverList.Add(server.ServerID, server);
                }
            }
            catch (Exception ex)
            {
                log.Write("Exception in RecServerFromLB " + ex);
                Console.WriteLine("Exception in RecServerFromLB " + ex);
            }
        }
        private static void FetchServers(TcpListener serverSocket)
        {
            bool newServer;

            try
            {
                while (true)
                {
                    newServer = true;
                    TcpClient serverTCPSocket = default(TcpClient);
                    Console.WriteLine("Started Listening .....");
                    serverTCPSocket = serverSocket.AcceptTcpClient();


                    IList <string> msgSplit;
                    msgSplit = serverTCPSocket.Client.RemoteEndPoint.ToString().Split(':');
                    foreach (HandleServer handleserver in serverList.Values)
                    {
                        Console.WriteLine(msgSplit[0] + " = " + handleserver.ServerIP + " " + msgSplit[0].Equals(handleserver.ServerIP));
                        if (msgSplit[0].Equals(handleserver.ServerIP))
                        {
                            handleserver.Connected    = true;
                            handleserver.ServerSocket = serverTCPSocket;
                            handleserver.StartServer();
                            newServer = false;
                            log.Write("server " + handleserver.ServerIP + " has reconected ");
                            Console.WriteLine("server " + handleserver.ServerIP + " has reconected ");
                            //lock (disconnectedServerList)
                            //    disconnectedServerList.Remove(handleserver.ServerID);
                            //Console.WriteLine("Clearing List " + disconnectedServerList.Count + " deleted " + handleserver.ServerID + handleserver.Connected + handleserver.ServerSocket.Connected);
                        }
                    }
                    if (newServer)
                    {
                        HandleServer server = new HandleServer {
                            ServerID = Interlocked.Increment(ref sereverounter), ServerSocket = serverTCPSocket, Sender = false, ServerIP = msgSplit[0]
                        };
                        server.StartServer();
                        serverList.Add(server.ServerID, server);
                    }
                }
            }
            catch (Exception ex)
            {
                log.Write("Exception in FetchServers " + ex);
                Console.WriteLine("Exception in FetchServers " + ex);
            }
        }
        private static void DiscServersProcessor()
        {
            try
            {
                bool clear = false;
                while (true)
                {
                    reconnectServerWait.WaitOne();

                    lock (disconnectedServerList)
                    {
                        if (0 != disconnectedServerList.Count)
                        {
                            log.Write("Sometihng has crashed ");
                            Console.WriteLine("Sometihng has crashed " + disconnectedServerList.Count);

                            foreach (int serverID in disconnectedServerList)
                            {
                                HandleServer server       = (HandleServer)serverList[serverID];
                                TcpClient    serverSocket = new TcpClient();
                                if (!server.Connected)
                                {
                                    if (server.Sender)
                                    {
                                        server.ReconnectServer();
                                        clear = true;
                                    }
                                    else
                                    {
                                        log.Write("Reconnecting server but it is not a sender so waiting for " + server.ServerIP);
                                        Console.WriteLine("=================== Reconnecting server but it is not a sender so waiting for " + server.ServerIP);
                                    }
                                }
                            }
                        }
                    }

                    if (clear)
                    {
                        Thread.Sleep(15000);
                        log.Write("Clearing List " + disconnectedServerList.Count);
                        Console.WriteLine("Clearing List " + disconnectedServerList.Count);
                        lock (disconnectedServerList)
                        {
                            foreach (int serverID in disconnectedServerList)
                            {
                                HandleServer server = (HandleServer)serverList[serverID];
                                server.Connected = true;
                            }
                            disconnectedServerList.Clear();
                        }

                        clear = false;
                    }
                    reconnectServerWait.Reset();
                }
            }
            catch (Exception ex)
            {
                log.Write("Exception in DiscServersProcessor " + ex);
                Console.WriteLine("Exception in DiscServersProcessor " + ex);
            }
        }
        public async static void FrwrdMsgToServer(byte[] msg, int msgType, string recieverID)
        {
            Byte[]        msgTypeBuff = new Byte[4];
            Byte[]        finalMsg    = new Byte[4 + msg.Length];
            NetworkStream networkStream;
            bool          clientFound = false;
            HandleServer  serverFail  = null;

            try
            {
                using (MemoryStream mem = new MemoryStream(msgTypeBuff))
                {
                    using (BinaryWriter BW = new BinaryWriter(mem))
                    {
                        BW.Write(msgType);
                    }
                }
                Array.Copy(msgTypeBuff, finalMsg, 4);
                Array.Copy(msg, 0, finalMsg, 4, msg.Length);

                foreach (HandleServer server in serverList.Values)
                {
                    serverFail = server;
                    if (server.ClientsList.Contains(recieverID))
                    {
                        clientFound = true;
                        if (server.Connected && null != server.ServerSocket)
                        {
                            try
                            {
                                networkStream = server.ServerSocket.GetStream();
                                await networkStream.WriteAsync(finalMsg, 0, finalMsg.Length);

                                networkStream.Flush();
                            }
                            catch (IOException)
                            {
                                log.Write(serverList.Count + " Server socket has been closed so discarding the message " + recieverID);
                                discardedClientsList.Add(recieverID);
                                // Console.WriteLine("Discarding" + serverFail.ServerID);
                                lock (disconnectedServerList)
                                    log.Write("enterred " + recieverID);
                                {
                                    if (!disconnectedServerList.Contains(serverFail.ServerID))
                                    {
                                        serverFail.ServerSocket.Close();
                                        serverFail.Connected = false;
                                        Console.WriteLine("adding serverIP" + recieverID);
                                        disconnectedServerList.Add(serverFail.ServerID);
                                        reconnectServerWait.Set();
                                    }
                                }
                                continue;
                            }
                            catch (ObjectDisposedException)
                            {
                                log.Write(serverList.Count + " Server socket has been closed so discarding the message local try catch " + recieverID);
                                discardedClientsList.Add(recieverID);
                                // Console.WriteLine("Discarding" + serverFail.ServerID);
                                lock (disconnectedServerList)
                                {
                                    log.Write("enterred " + recieverID);
                                    if (!disconnectedServerList.Contains(serverFail.ServerID))
                                    {
                                        serverFail.ServerSocket.Close();
                                        serverFail.Connected = false;
                                        Console.WriteLine("adding serverIP " + recieverID);
                                        disconnectedServerList.Add(serverFail.ServerID);
                                        reconnectServerWait.Set();
                                    }
                                }
                                continue;
                            }


                            break;
                        }
                        else
                        {
                            log.Write(" server " + server.ServerIP + " has crashed so Discarding this msg  FrwrdMsgToServer");
                            // Console.WriteLine(recieverID);
                            discardedClientsList.Add(recieverID);
                            lock (disconnectedServerList)
                            {
                                if (!disconnectedServerList.Contains(serverFail.ServerID))
                                {
                                    serverFail.ServerSocket.Close();
                                    serverFail.Connected = false;
                                    Console.WriteLine("adding FrwrdMsgToServer");
                                    disconnectedServerList.Add(serverFail.ServerID);
                                    reconnectServerWait.Set();
                                }
                            }
                        }
                    }
                }
                if (!clientFound)
                {
                    HandleServer server = (HandleServer)serverList[1];
                    log.Write("Receiver not found in any srever " + recieverID);
                }
            }

            catch (Exception ex)
            {
                log.Write("Exception occured in FrwrdMsgToServer " + ex);
                Console.WriteLine("Exception occured in FrwrdMsgToServer " + ex);
            }
        }
        private static void SendRemoveClientMSG(string clientID)
        {
            HandleServer serverFail = null;

            Byte[] msgTypeBuff = new Byte[4];
            Byte[] Size        = new Byte[4];
            Byte[] finalMsg;

            try
            {
                lock (clientsList)
                {
                    if (clientsList.Contains(clientID))
                    {
                        clientsList.Remove(clientID);
                    }
                    else
                    {
                        log.Write("Client already removed from this server List. So not sending it to servers");
                        return;
                    }
                }

                log.Write("Sending client ID " + clientID + " to Servers to remove from List ");
                using (MemoryStream mem = new MemoryStream(msgTypeBuff))
                {
                    using (BinaryWriter BW = new BinaryWriter(mem))
                    {
                        BW.Write(3);
                    }
                }
                Byte[] buffer = Encoding.Default.GetBytes(clientID);

                using (MemoryStream mem = new MemoryStream(Size))
                {
                    using (BinaryWriter BW = new BinaryWriter(mem))
                    {
                        BW.Write(buffer.Length);
                    }
                }
                finalMsg = new byte[8 + buffer.Length];
                Array.Copy(msgTypeBuff, finalMsg, 4);
                Array.Copy(Size, 0, finalMsg, 4, 4);
                Array.Copy(buffer, 0, finalMsg, 8, buffer.Length);

                foreach (HandleServer server in serverList.Values)
                {
                    serverFail = server;
                    if (server.Connected && server.ServerSocket.Connected)
                    {
                        NetworkStream netwrokStream = server.ServerSocket.GetStream();
                        netwrokStream.Write(finalMsg, 0, finalMsg.Length);
                        netwrokStream.Flush();
                        log.Write("Sending message to server " + server.ServerIP + " to Remove " + clientID);
                    }
                    else
                    {
                        log.Write("server " + server.ServerIP + " has crashed so reconnecting it SendRemoveClientMSG Excep ");
                        //server.Connected = false;
                        lock (disconnectedServerList)
                        {
                            if (!disconnectedServerList.Contains(serverFail.ServerID))
                            {
                                serverFail.ServerSocket.Close();
                                serverFail.Connected = false;
                                disconnectedServerList.Add(serverFail.ServerID);
                                reconnectServerWait.Set();
                            }
                        }
                    }
                }
            }
            catch (ObjectDisposedException ex)
            {
                log.Write("ObjectDisposedException in RemoveClientMSG " + ex);
                lock (disconnectedServerList)
                {
                    if (!disconnectedServerList.Contains(serverFail.ServerID))
                    {
                        serverFail.ServerSocket.Close();
                        serverFail.Connected = false;
                        disconnectedServerList.Add(serverFail.ServerID);
                        reconnectServerWait.Set();
                    }
                }
            }
            catch (InvalidOperationException ex)
            {
                log.Write("InvalidOperationException in RemoveClientMSG " + ex);
                lock (disconnectedServerList)
                {
                    if (!disconnectedServerList.Contains(serverFail.ServerID))
                    {
                        serverFail.ServerSocket.Close();
                        serverFail.Connected = false;
                        disconnectedServerList.Add(serverFail.ServerID);
                        reconnectServerWait.Set();
                    }
                }
            }
            catch (IOException ex)
            {
                log.Write("IOException in RemoveClientMSG " + ex);
                lock (disconnectedServerList)
                {
                    if (!disconnectedServerList.Contains(serverFail.ServerID))
                    {
                        serverFail.ServerSocket.Close();
                        serverFail.Connected = false;
                        disconnectedServerList.Add(serverFail.ServerID);
                        reconnectServerWait.Set();
                    }
                }
            }
            catch (Exception ex)
            {
                log.Write("Exception in RemoveClientMSG " + ex);
                Console.WriteLine("Exception in RemoveClientMSG " + ex);
            }
        }