using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; using System.Threading; namespace Server { public class Server { //Je adresboek private Dictionary phoneBook; //Je inbox private Queue> inbox; //de poort waarna je luistert private int port; //maak een server object public Server(int port) { this.port = port; inbox = new Queue>(); phoneBook = new Dictionary(); } //De methode die wacht op nieuwe verbindingen. Zodra een Client wil verbinden doe je //een aantal dingen public void run() { //start listening to port TcpListener listener = new TcpListener(port); listener.Start(); //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 TcpClient client = listener.AcceptTcpClient(); //just console information Console.WriteLine("New client accepted"); //maak een ClientHandler aan, en geef de naam aan de client ClientHandler ch = new ClientHandler(this, client, "client_" + counter); //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; //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; } } } }