/// <summary> /// Function that finds a server with space for additional clients to be added. /// </summary> /// <param name="serverType">The type of server to search for</param> /// <returns></returns> public override ServerModel GetAvailableServer(ServerTypes serverType) { // Is there a server with room on it? var available = false; var availableServerIndex = -1; foreach (var server in ServerList .Where(server => server.Value.ConnectedClientModelList.Count < ReversiSettings.MaxReversiServerConnections - 1) .Where(server => server.Value.Type == serverType)) { available = true; availableServerIndex = server.Key; break; } // If no servers are available, create a new server; ServerModel newServer; if (!available) { // TODO: Will this crash if there is already a reversi game server running? newServer = new ReversiGameServerModel(GlobalSettings.ServerAddress, GlobalSettings.Port_GameServer); AddServerToManager(newServer); } else { // Retrieve the server by its index value newServer = GetServerFromListById(availableServerIndex); } return(newServer); }
/// <summary> /// The main thread handle for this reversi server. /// </summary> public override void HandleServerThread() { Console.WriteLine("Server " + Id + ": Starting HandleServerThread"); while (!ShouldShutdown) { if (ConnectedClientModelList.Count == 0) { //Console.WriteLine("No clients on ReversiServerManager " + Id); Thread.Sleep(ServerSettings.ServerUpdatePulseDelay); continue; } //// Check for enough clients to place on a server //Console.WriteLine("RSM currently has " + ConnectedClientModelList.Count + " clients connected to it..."); // Get the oldest client ReversiClientModel oldestClientModel = (ReversiClientModel)GetOldestClientModelFromConnectedList(); Console.WriteLine("-- Oldest available client is: " + oldestClientModel.Id); // Find an available game server or create a new one ReversiGameServerModel availableServer = (ReversiGameServerModel)GetAvailableServer(ServerTypes.ServerGameserver); Console.WriteLine("-- Available server is: " + availableServer.Id); // Move the client model to a reversi game server.... availableServer.AddClientModelToServer(oldestClientModel); Console.WriteLine("-- Adding client " + oldestClientModel.Id + " to game server " + availableServer.Id); // And remove it from the connected list RemoveClientModelFromConnectedList(oldestClientModel); //Console.WriteLine("-- Client removed from ReversiServerManager list"); } }