using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Net; using System.Net.Sockets; using System.Threading; using MudEngine.Game; using MudEngine.Game.Characters; namespace MudEngine.Networking { public class ConnectionManager { //Collection of currently connected players. internal List _ConnectedThreads; internal List _ConnectedCharacters; public ConnectionManager(Int32 maxPlayers) { this._ConnectedCharacters = new List(maxPlayers); this._ConnectedThreads = new List(maxPlayers); } /// /// Creates a new character for the player and sets it up on the server. /// /// /// public void AddConnection(StandardGame game, Socket connection) { //Instance a new character and provide it with the Socket. StandardCharacter character = new StandardCharacter(game, "New Player", "New networked client.", connection); //Invoke the Characters Server connection method character.Connect(connection); this._ConnectedCharacters.Add(character); this._ConnectedThreads.Add(new Thread(ReceiveDataThread)); Int32 index = this._ConnectedThreads.Count - 1; this._ConnectedThreads[index].Start(index); } public StandardCharacter[] GetConnectedCharacters() { return this._ConnectedCharacters.ToArray(); } private void ReceiveDataThread(Object index) { StandardCharacter character = this._ConnectedCharacters[(Int32)index]; character.Initialize(); while (character.Game.Server.Status == ServerStatus.Running && character.Enabled) { try { character.ExecuteCommand(character.GetInput()); } catch { RemoveConnection(character); } } RemoveConnection(character); } /// /// Removes the specified player character from the server. /// /// public void RemoveConnection(StandardCharacter character) { character.Save(character.Filename); character.Disconnect(); foreach (StandardCharacter c in this._ConnectedCharacters) { if (c.ID == character.ID) { Int32 index = _ConnectedCharacters.IndexOf(c); this._ConnectedCharacters.Remove(character); this._ConnectedThreads[index].Abort(); } } } /// /// Disconnects all of the currently connected clients. /// public void DisconnectAll() { for (Int32 i = 0; i < this._ConnectedCharacters.Count; i++) { this._ConnectedCharacters[i].Disconnect(); this._ConnectedThreads[i].Abort(); } this._ConnectedCharacters.Clear(); this._ConnectedThreads.Clear(); } } }