using System; using System.Collections; using System.Data; using System.Net; using System.Net.Sockets; using System.Threading; using ChatMessage = IMDrawLibrary.Message; namespace IMDrawServer { class Server { SocketServer socketServer; ClientCollection clientCollection; private delegate void ReceiveMessageDelegate(TcpClient tcpClient); private void runServer(string ipAddress, string portNumber) { try { clientCollection = new ClientCollection(); socketServer = new SocketServer(ipAddress, portNumber); socketServer.ClientConnected += new SocketServer.ClientConnectedEventHandler(socketServer_ClientConnected); socketServer.MessageReceived += new SocketServer.MessageReceivedEventHandler(socketServer_MessageReceived); socketServer.ClientDisconnecting += new IMDrawServer.SocketServer.ClientDisconnectingEventHandler(socketServer_ClientDisconnecting); socketServer.Listen(); Console.WriteLine("Server Started"); } catch (Exception ex) { Console.WriteLine("Exception thrown while running server. " + ex.ToString()); } } private void AddClientToList(Client client) { clientCollection.Add(client); string strWriteMessage = "Connected: " + client.Name; Console.WriteLine(strWriteMessage); } private void SendClientList() { string strClientList = string.Empty; for (int i = 0; i < clientCollection.Count; i++) { strClientList += clientCollection[i].Name + "@"; } strClientList = strClientList.TrimEnd(new char[] { '@' }); ChatMessage clientListMessage = new IMDrawLibrary.Message(); clientListMessage.Sender = IMDrawLibrary.Common.BossName; clientListMessage.Receiver = IMDrawLibrary.Common.All; clientListMessage.MessageCommand = IMDrawLibrary.Command.ClientList; clientListMessage.TextDetail = strClientList; Announce(clientListMessage); } private void Announce(ChatMessage messageToAnnounce) { for (int i = 0; i < clientCollection.Count; i++) { clientCollection[i].SendMessage(messageToAnnounce); } } private void socketServer_ClientConnected(object sender, Client client) { AddClientToList(client); SendClientList(); } private void socketServer_MessageReceived(object sender, IMDrawLibrary.Message clientMessage) { if (clientMessage.MessageCommand.Equals(IMDrawLibrary.Command.Message)) { for (int i = 0; i < clientCollection.Count; i++) { if (clientMessage.Receiver.Equals(clientCollection[i].Name)) { clientCollection[i].SendMessage(clientMessage); Console.WriteLine("Message sent from " + clientMessage.Sender + " to " + clientMessage.Receiver); } } } } private void socketServer_ClientDisconnecting(object sender, string clientName) { ChatMessage logoutMessage = new IMDrawLibrary.Message(); logoutMessage.Sender = IMDrawLibrary.Common.BossName; logoutMessage.Receiver = clientName; logoutMessage.MessageCommand = IMDrawLibrary.Command.Logout; for (int i = 0; i < clientCollection.Count; i++) { if (clientCollection[i].Name.Equals(logoutMessage.Receiver)) { clientCollection[i].Socket.Close(); clientCollection.Remove(clientName); } } Console.WriteLine("Disconnected: " + clientName); SendClientList(); } static void Main(string[] args) { if (args.Length != 2) { Console.WriteLine("Must pass IP Address followed by port number for the server."); Console.WriteLine("Ex Server 192.168.25.16 7999"); } else { Server server = new Server(); server.runServer(args[0], args[1]); } } } }