using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; using System.Threading; using System.IO; using Microsoft.Xna.Framework; public class Server { //Je adresboek private Dictionary phoneBook; //Je inbox private Queue> inbox; //de poort waarna je luistert private int port; TcpListener listener; bool running; bool clientSended; public GameWorld gameWorld; ClientHandler ch; TcpClient client; //maak een server object public Server(int port, GameWorld gw) { gameWorld = gw; this.port = port; inbox = new Queue>(); phoneBook = new Dictionary(); } public bool isRunning() { return running; } public void kill() { Console.WriteLine("Server stopped on port " + port); running = false; listener.Stop(); listener = null; } //De methode die wacht op nieuwe verbindingen. Zodra een Client wil verbinden doe je //een aantal dingen public void run() { //start listening to port listener = new TcpListener(port); listener.Start(); running = true; //Just show information on console Console.WriteLine("Server started on port " + port); //wait for clients int counter = 0; while (true) { //Wacht tot een client wil verbinden try { client = listener.AcceptTcpClient(); } catch { GameModeHandler gmHandler = gameWorld.Find("gmHandler") as GameModeHandler; gmHandler.CurrentGameMode = GameModeHandler.GameMode.Menu; } //just console information Console.WriteLine("New client accepted"); //maak een ClientHandler aan, en geef de naam aan de client ch = new ClientHandler(this, client, "client_" + counter, gameWorld); //stuur de naam naar de client to, zodat de client zijn eigen naam weet ch.sendMessage(ch.Name); //sla de client op in je adresboek phoneBook[ch.Name] = ch; clientSended = true; //en start een aparte thread die alle communicatie met deze client afhandeld Thread t = new Thread(ch.run); t.Start(); //verhoog de teller counter++; } } //Deze methode wordt aangeroepen zodra een van je clients een bericht ontvangt. Dit hoef je dus //nooit zelf te doen. Het stopt het bericht in je inbox. public void receiveMessage(string sender, string message) { //laat zien op je console Console.WriteLine(sender+" sended:"+message); //lock kennen jullie niet, maar zorgt dat nooit meer dan 1 thread tegelijk iets met een object kan doen lock(inbox) { inbox.Enqueue(new KeyValuePair(sender,message)); } } //stuur een bericht naar een client met een specifieke naam. public void sendMessage(string to, string message) { phoneBook[to].sendMessage(message); } //stuur een bericht naar alle clients die in je adresboek staan public void broadcastMessage(string message) { foreach (ClientHandler ch in phoneBook.Values) ch.sendMessage(message); } public Queue> Inbox { get { return inbox; } } public Dictionary PhoneBook { get { return phoneBook; } } public bool ClientSended { get { return clientSended; } set { clientSended = value; } } public bool ClientConnected { get { return ch.ClientConnected; } set { ch.ClientConnected = value; } } public ClientHandler CH { get { return ch; } set { ch = value; } } }