title: MultiClient / Server. Handle communications
body: <p>I am suffering with this codes since two days now. In fact I am developping an application which has a server side and the clients side. The server receives request from clients every seconds, treat the request by contacting the database and then send back the result to the client.
  I do such a way that if the client starts before the server, it will remain trying to connect to the server on the given port and the given host.<br />
  1. This is the server side:</p>
  
  <pre><code>try
      {   
          Client client = new Client(jTable1,jLabel3);
          Thread t = new Thread(client);
          t.start();
  
      }catch(IOException e){}
  </code></pre>
  
  <p>Class Client.java</p>
  
  <pre><code>public class Client implements Runnable{
  
  private int svrPort = 0;
  ServerSocket serverConnect = null;
  static  Socket clientSocket = null;
  static  ClientConnectThread t[] = new ClientConnectThread[1000];
  JTable jtable;
  JLabel jlabel;
  
  public Client(JTable table, JLabel label) throws IOException {
  
      this.svrPort = 9450;
      this.jtable = table;
      this.jlabel = label;
  
  }
  
  public void run(){
      try{
          serverConnect = new ServerSocket(this.svrPort);
  
      }catch(IOException e){}
      while(true){
          try{
              clientSocket = serverConnect.accept ();
              for(int i=0; i&lt;=1000; i++){ //I can accept up to 1000 clients
          if(t[i]==null)
          {
              (t[i] = new ClientThread(client, t, jtable, jlabel)).start();
                          System.out.println ("Etat12. Apres bloc try");
              break;
          }
      }
          }catch(IOException e){}
      }
  }
  </code></pre>
  
  <p>}</p>
  
  <p>Class ClientThread.java</p>
  
  <pre><code>public ClientThread(Socket socket, ClientThread t[], JTable table, JLabel label){
  
      this._socket = socket;
      this.jTable = table;
      this.jlabel = label;
      this.totalConnected = 0;       
      this.t = t;
  }
  
  public void run(){
  
      int index = 0;
      try{
          this._output = new PrintWriter(this._socket.getOutputStream ());
          this._input = new BufferedReader(new InputStreamReader(this._socket.getInputStream()));
  
          while((clientMsg = this._input.readLine ()) != null){
              if(clientMsg.equals ("@CONNECT")){ // If it is the first time the user is signig in, fill the table
  
                  jTable.setValueAt (this._socket.getInetAddress (), index, 0);
                  jTable.setValueAt (new Date(), index, 1);
                  jTable.setValueAt (new Date(), index, 2);
                  totalConnected++;
                  jlabel.setText ("");
                  jlabel.setText (totalConnected+"");
  
              }else if(Integer.parseInt (clientMsg) == 1){
                  int p = Integer.parseInt (clientMsg);
                  this._output = new PrintWriter(this._socket.getOutputStream(), true);
                  if (this.getData.connect ())
                  {
                      if(this.getData.getDataByType (1).size () == 0){
                      }
                      _output.println (this.getData.getDataByPeriod (1));
                  }else{System.out.println("You are not connected to the database server");}
  
              }else if(Integer.parseInt (clientMsg) == 2){
                  int p = Integer.parseInt (clientMsg);
                  this._output = new PrintWriter(this._socket.getOutputStream(), true);
                  if (this.getData.connect ())
                  {
                      if(this.getData.getDataByPeriod (2).size () == 0)System.out.println ("There is no data corresponding");
                      this._output.println (this.getData.getDataByPeriod (2));
                  }else{System.out.println("You are not connected to the database server");}
  
  
              }else if(Integer.parseInt (clientMsg) == 3){
                  int p = Integer.parseInt (clientMsg);
                  this._output = new PrintWriter(this._socket.getOutputStream(), true);
                  if (this.getData.connect ())
                  {
                      if(this.getData.getDataByType (3).size () == 0)System.out.println ("There is no data corresponding");
                      this._output.println (this.getData.getDataByType (30));
                  }else{System.out.println("You are not connected to the database server");}
  
  
              }else if(Integer.parseInt (clientMsg) == 4){
                  int p = Integer.parseInt (clientMsg);
                  this._output = new PrintWriter(this._socket.getOutputStream(), true);
                  if (this.getData.connect ())
                  {
                      if(this.getData.getDataByType (4).size () == 0)System.out.println ("There is no data corresponding");
                      this._output.println (this.getData.getDataByType (60));
                  }else{System.out.println("You are not connected to the database server");}
  
  
              }else{
  
              }
          }
          this._input.close ();
          this._output.close ();
      }catch(IOException e){}
  
  }
  </code></pre>
  
  <p>These are the two classes that make my server running. The class Client.java starts and waits to accept connection. When a client connects an instance of clientThread is created and associated to the client.
  Till here every thing seems to be working well.</p>
  
  <p>Client side</p>
  
  <pre><code>public class ServerConnect implements Runnable{
  
  public static Socket clientSocket = null;
  public static PrintWriter out = null;
  public static BufferedReader in = null;
  public static int port=9450;
  public static String host = "127.0.0.1";
  public static JLabel myLabel;
  public static JButton button;
  public static ResourceMap resourceMap;
  private static String serverMsg = "";
  
  public ServerConnect(JLabel jLabel, JButton b)
  {
      jLabel.setText ("Trying to contact the server");
      myLabel = jLabel;
      button = b;
      port = Integer.parseInt("9450");
      host = "127.0.0.1";
  
          try{
              clientSocket = new Socket(host, port);
              }catch(IOException e){e.printStackTrace ();}
  
  }
  
  public void run()
  {
      while(true){
          while(!this.connect ())
          {myLabel.setText ("You are not connected to the server : "+host);
           button.setEnabled (false);
              try{
                  clientSocket = new Socket(host, port);
              }catch(IOException e){}
          }
  
          myLabel.setText ("You are connected to the server : "+host);
          button.setEnabled (true);
          try{
             out = new PrintWriter(clientSocket.getOutputStream(), true);
             out.println("@CONNECT");
  
             in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
             while((serverMsg = in.readLine ()) != null){
                  System.out.println ("&lt;=&gt; :"+serverMsg);
             }
          }
          catch(IOException e){e.printStackTrace ();}
      }
  }
  private boolean connect()
  {
      try{
          clientSocket = new Socket(host, port);
          return true;
      }catch(IOException e){}
      return false;
  }}
  </code></pre>
  
  <p>My problem is that when the two sides are starting, the only thing the client sends @CONNECT, the server receives it and all stops here. If the client sends a requests again, the server does not answer.<br />
  I would like someone to show me step by step how I can setup this applications<br />
  - Server side. Accepts connections in thread with the WHILE loop<br />
  - Client side. In another thread to try to contact the server everytime to establish a connection<br />
  - In another thread again, client sends request to server<br />
  - The server is another thread request the information from the database and sends back to client.<br /></p>
  
  <p>I thank you so much for your help</p>