/* * ChatServer.java * * Created on den 2 september 2001, 08:32 */ package ip1.u3.b; import java.util.Iterator; /** ChatServer-applikationens start och kontrollklass. Skapar först GUIet, som * visar upp vad som händer: Vilka klienter som kopplar upp eller ner sig * samt de meddelanden som skickas från klienterna. sedan skapas ett ConnectionListener * som lyssnar efter klienter som vill koppla upp sig, när detta sker kommer * ConnectionListener att be denna kontrollklass att lägga en ClientListener till sin * lista med uppkopplade klienter och återgå till att lyssna efter fler uppkopplingar. * När ClientListener tar emot ett meddelande från en klient kommer ChatServer att meddelas * via sin broadcast-metod med meddelandet och klientadressen som argument, meddelandet sänds * då till alla uppkopplade klienter samt visas i GUIet. * * @author Henrik Johansson, DS80 * @version ht2001 */ public class ChatServer { private ConnectionListener connectionListener = null; private ChatServerGUI gui = null; private java.util.Set clients; private int numberOfClients = 0; private int port; private String host; /** Skapar en ny ChatServer. Använder port 2000 */ public ChatServer() { this(2000); } /** Skapar en ny ChatServer. Läser portnummret från kommandoraden. * *@param port Portnummret som skall användas. */ public ChatServer(int port) { this.port = port; gui = new ChatServerGUI(this); connectionListener = new ConnectionListener(this, port); host = connectionListener.getHost(); clients = new java.util.HashSet(); gui.updateTitle(connectionListener.getHost(), port, numberOfClients); gui.showMessage("Server started"); } /** Tar bort en ClientListener (klient) från mänden av * ClientListeners (uppkopplade klienter). * *@param client Den ClientListener som skall tas bort. */ synchronized public void remove(ClientListener client) { clients.remove((Object) client); this.sendMessage(client.getInetAddress() + " disconnecting"); } /** Lägger till en CLientListener (klient) till mängden av * ClientListeners (uppkopplade klienter). * *@param client Den ClientListener som skall läggas till. */ synchronized public void add(ClientListener client) { clients.add(client); gui.updateTitle(host, port, ++numberOfClients); sendMessage(client.getInetAddress() + " connecting"); client.sendMessage("Chat Server say > welcome to chat"); } /** Broadcastar ett meddelande från en klient till samtliga uppkopplade klienter. * *@param clientHost Addressen för klienten som skickat meddelandet. *@param message Meddelandet som klienten skickat. */ synchronized public void broadcast(String clientHost, String message) { sendMessage(clientHost + ": " + message); } // Sköter om det igentliga meddelandeskickandet, anropas av broadcast. private void sendMessage(String message) { gui.showMessage(message); ClientListener client; Iterator iterator = clients.iterator(); while(iterator.hasNext()) { ((ClientListener) iterator.next()).sendMessage(message); } } /** Avslutar ChatServer-applikationen. Skickar meddelande till de * klienter som eventuellt är uppkopplade och meddelar att servern * kommer att gå ner. Stänger ala öppna socketar. */ synchronized public void closeServer() { connectionListener.close(); sendMessage("Chat Server say > Server will close down"); Iterator iterator = clients.iterator(); while(iterator.hasNext()) { ((ClientListener) iterator.next()).close(); } System.exit(0); } /** ChatServer-applikationens main-metod. * * @param args kommandolinjeargument. */ public static void main (String args[]) { if(args.length == 1) { try { int port = Integer.parseInt(args[0]); new ChatServer(port); } catch(NumberFormatException e) { System.err.println(e.getMessage()); System.exit(1); } } else new ChatServer(); } }