title: Limit number of clients that can connect to the server at the same time
body: <p>I need to limit the number of clients that can connect to the server . 
  I only want 5 clients to be able to connect.
  When a 6th client tries to connect, he'll be added to the queue.
  Once one of the clients leaves, the .remove is called, it will go to the queue and fetch the first client waiting and connect him to the chat.</p>
  
  <pre><code>    public void start() {
      keepGoing = true;
      /* create socket server and wait for connection requests */
      try 
      {
          // the socket used by the server
          ServerSocket serverSocket = new ServerSocket(port);
  
          // infinite loop to wait for connections
          while(keepGoing) 
          {
              // format message saying we are waiting
              display("Server waiting for Clients on port " + port + ".");
  
              Socket socket = serverSocket.accept();      // accept connection
              // if I was asked to stop
              if(!keepGoing)
                  break;
              ClientThread t = new ClientThread(socket);  // make a thread of it
              al.add(t);                                  // save it in the ArrayList
              t.start();
          }
          // I was asked to stop
          try {
              serverSocket.close();
              for(int i = 0; i &lt; al.size(); ++i) {
                  ClientThread tc = al.get(i);
                  try {
                  tc.sInput.close();
                  tc.sOutput.close();
                  tc.socket.close();
                  }
                  catch(IOException ioE) {
                      // not much I can do
                  }
              }
          }
          catch(Exception e) {
              display("Exception closing the server and clients: " + e);
          }
      }
      // something went bad
      catch (IOException e) {
          String msg = sdf.format(new Date()) + " Exception on new ServerSocket: " + e + "\n";
          display(msg);
      }
  }   
  </code></pre>
  
  <p>To broadcast a message to all Clients:</p>
  
  <pre><code>    private synchronized void broadcast(String message) {
      // add HH:mm:ss and \n to the message
      String time = sdf.format(new Date());
      String messageLf = time + " " + message + "\n";
      // display message on console or GUI
      if(sg == null)
          System.out.print(messageLf);
      else
          sg.appendRoom(messageLf);     // append in the room window
  
      // we loop in reverse order in case we would have to remove a Client
      // because it has disconnected
      for(int i = al.size(); --i &gt;= 0;) {
          ClientThread ct = al.get(i);
          // try to write to the Client if it fails remove it from the list
          if(!ct.writeMsg(messageLf)) {
              al.remove(i);
              display("Disconnected Client " + ct.username + " removed from list.");
            }
        }
    }
  </code></pre>
  
  <p>For a client who logoff using the LOGOUT message:</p>
  
  <pre><code>    synchronized void remove(int id) {
      // scan the array list until we found the Id
      for(int i = 0; i &lt; al.size(); ++i) {
          ClientThread ct = al.get(i);
          // found it
          if(ct.id == id) {
              al.remove(i);
              return;
          }
      }
  }
  </code></pre>