title: Socket Authentication Server?
body: <p>I am currently playing with java to create an authentication server for a desktop app and so far I have been able to make both the client and server communicate like a chat server/client for a start.</p>
  
  <p>I do realise I only got a small portion of it working and there are many things to come and to learn but right now at this stage I am wondering how the authentication is done.</p>
  
  <p>For example, this is the server code:</p>
  
  <pre><code>import java.io.BufferedReader;
  import java.io.InputStreamReader;
  import java.io.OutputStreamWriter;
  import java.io.IOException;
  import java.io.PrintWriter;
  import java.net.ServerSocket;
  import java.net.Socket;
  
  public class LoginServer
  {
      public static void main(String[] args) throws Exception {
          int port = 7000;
          int id = 1;
  
          ServerSocket loginserver = null;
          try
          {
              loginserver = new ServerSocket(port);
              System.out.println("LoginServer started...");
          }
          catch (IOException e) {
              System.out.println("Could not listen on port: " + port);
              System.exit(-1);
          }
  
          while (true)
          {
              Socket clientSocket = loginserver.accept();
              ClientServiceThread cliThread = new ClientServiceThread(clientSocket, id++);
              cliThread.start();
          }
      }
  }
  
  class ClientServiceThread extends Thread
  {
      Socket clientSocket;
      int clientID = -1;
      boolean running = true;
  
      ClientServiceThread(Socket s, int i)
      {
          clientSocket = s;
          clientID = i;
      }
  
      public void run()
      {
          System.out.println("Accepted Client : ID - " + clientID + " : Address - " + clientSocket.getInetAddress().getHostName());
          try
          {
              BufferedReader   in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
              PrintWriter   out = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
              while (running)
              {
                  String clientCommand = in.readLine();
                  System.out.println("Client Says :" + clientCommand);
                  if (clientCommand.equalsIgnoreCase("quit"))
                  {
                      running = false;
                      System.out.print("Stopping client thread for client : " + clientID);
                  }
                  else
                  {
                      out.println(clientCommand);
                      out.flush();
                  }
              }
          }
          catch (Exception e)
          {
              e.printStackTrace();
          }
      }
  }
  </code></pre>
  
  <p>As you can see, I do read what the client sends and output it to the console as well as checking if the client has sent a quit or not command.</p>
  
  <ul>
  <li><p>What I am wondering is how would I do
  so that the client can only connect
  to it if the user and password was
  sent ?</p></li>
  <li><p>Or should I always receive the
  initial connection and from there
  receive the authentication
  information and if the client has not
  sent it in let's say 3 seconds
  disconnect them ?</p></li>
  <li><p>What is the correct way of receiving
  the new connections and authenticate
  the users with it ?</p></li>
  </ul>