title: TCP Chat Server
body: <p>I am modifying a tutorial I found on how to create a TCP Chat Server that accepts multiple clients. I will eventually create a client class as well, but so far I am testing it with TELNET. </p>
  
  <p>I want the server to continually check for input so I can use key words to preform server functions. So string word "EXIT" to disconnect the client and the string word "Name:" to print "OK". </p>
  
  <p><strong>This is what I was thinking but it doesn't work:</strong> </p>
  
  <pre><code> public void run()  
      {
           String line;
           try    
           {
              while(true)   
              {
                  if (input.readline("EXIT"))//Should close and remove client
                  {
                      clients.remove(this);
                      users.remove(name);
                      break;
                  }
                  if(input.readline("Name:"))//Should print OK with username
                  {
                      System.out.println("OK");
                  }
                  boradcast(name,line); // method  of outer class - send messages to all
              }// end of while
           } // try
           catch(Exception e) 
           {
             System.out.println(e.getMessage());
           }
      } // end of run()
   }
  </code></pre>
  
  <p>}</p>
  
  <p><strong>Here is the whole server class</strong></p>
  
  <pre><code>// Chat Server runs at port no. 9020
  import java.io.*;
  import java.util.*;
  import java.net.*;
  import static java.lang.System.out;
  
  public class  TCPServer 
  {
    Vector&lt;String&gt; users = new Vector&lt;String&gt;();
    Vector&lt;HandleClient&gt; clients = new Vector&lt;HandleClient&gt;();
  
    int PORT = 9020;
    int NumClients = 10;
  
    public void process() throws Exception  
    {
        ServerSocket server = new ServerSocket(PORT,NumClients);
        out.println("Server Connected...");
        while( true) 
        {
           Socket client = server.accept();
           HandleClient c = new HandleClient(client);
           clients.add(c);
       }  // end of while
    }
  
    public static void main(String ... args) throws Exception 
    {
        new TCPServer().process();
    } // end of main
  
    public void boradcast(String user, String message)  
    {
          // send message to all connected users
          for (HandleClient c : clients)
             if (!c.getUserName().equals(user))
             {
                c.sendMessage(user,message);
             }
    }
  
    class HandleClient extends Thread 
    {
      String name = "";
      BufferedReader input;
      PrintWriter output;
  
      public HandleClient(Socket client) throws Exception 
      {
            // get input and output streams
           input = new BufferedReader(new InputStreamReader(client.getInputStream())) ;
           output = new PrintWriter (client.getOutputStream(),true);
           output.println("Welcome to Bob's Chat Server!\n");
           // read name
           output.println("Please Enter a User Name: ");
           name  = input.readLine();
           users.add(name); // add to vector
           output.println("Welcome "+name+" we hope you enjoy your chat today");
           start();
      }
  
      public void sendMessage(String uname,String  msg)  
      {
          output.println( uname + ":" + msg);
      }
  
      public String getUserName() 
      {  
          return name; 
      }
  
      public void run()  
      {
           String line;
           try    
           {
              while(true)   
              {
                  if (input.readline("EXIT"))
                  {
                      clients.remove(this);
                      users.remove(name);
                      break;
                  }
                  if(input.readline(name))
                  {
                      System.out.println("OK");
                  }
                  boradcast(name,line); // method  of outer class - send messages to all
              }// end of while
           } // try
           catch(Exception e) 
           {
             System.out.println(e.getMessage());
           }
      } // end of run()
    } // end of inner class
  } // end of Server
  </code></pre>