title: ObjectInputStream / ObjectOutputStream | client that receive and send a lot of objects (Java)
body: <p>I have a problem on my multithreaded server/client project.</p>
  
  <p>The server side is good but the problem is on the client side.</p>
  
  <p>I can send and receive objects every time I want I need to declare an <code>ObjectInputStream</code> and <code>ObjectOutputStream</code> as attributes on my Class and then instantiate them on the constructor</p>
  
  <p>But the problem is that the code is blocking on the <code>ObjectInputStream</code> instantiation.</p>
  
  <p>Here is my code:</p>
  
  <p>Client:</p>
  
  <pre><code> public class agency_auth_gui extends javax.swing.JFrame {
  
      Socket s_service;
      ObjectOutputStream out;
      ObjectInputStream in;
  
      public agency_auth_gui() {
          try {
              initComponents();
              System.out.println("#Connexion en cours avec le Serveur Bancaire.");
              s_service = new Socket("127.0.0.1", 6789);
  
              out = new ObjectOutputStream(new BufferedOutputStream(s_service.getOutputStream()));
              in= new ObjectInputStream(new BufferedInputStream(s_service.getInputStream()));
              //Authentification du Client GAB
              out.writeObject((String) "type:agence");
              out.flush();
  
          } catch (UnknownHostException ex) {
              Logger.getLogger(agency_auth_gui.class.getName()).log(Level.SEVERE, null, ex);
          } catch (IOException ex) {
              Logger.getLogger(agency_auth_gui.class.getName()).log(Level.SEVERE, null, ex);
          }
      }
  ...
  Some automaticaly generated swing code
  ...
      private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
          try {
              // Envoi d'une arraylist exec contenant l'authentification
  
              ArrayList exec = new ArrayList();
              exec.add("auth_agent");
              exec.add(jTextField1.getText());
              exec.add(jTextField2.getText());
              out.writeObject((ArrayList) exec);
              out.flush();
  
              // Reception de la reponse du serveur pour la fonction authentification
  
  
              Agent agent = (Agent) in.readObject();
              if(agent.getId()==0)
              {
                  System.out.println("null");
              }else
              {
                  System.out.println(agent.getId());
              }
  
          } catch (IOException ex) {
              Logger.getLogger(agency_auth_gui.class.getName()).log(Level.SEVERE, null, ex);
          } catch (ClassNotFoundException ex) {
              Logger.getLogger(agency_auth_gui.class.getName()).log(Level.SEVERE, null, ex);
          } 
      }                                        
  
  
      public static void main(String args[]) {
          try {
  
              for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                  if ("Nimbus".equals(info.getName())) {
                      javax.swing.UIManager.setLookAndFeel(info.getClassName());
                      break;
                  }
              }
  
          } catch (ClassNotFoundException ex) {
              java.util.logging.Logger.getLogger(agency_auth_gui.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
          } catch (InstantiationException ex) {
              java.util.logging.Logger.getLogger(agency_auth_gui.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
          } catch (IllegalAccessException ex) {
              java.util.logging.Logger.getLogger(agency_auth_gui.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
          } catch (javax.swing.UnsupportedLookAndFeelException ex) {
              java.util.logging.Logger.getLogger(agency_auth_gui.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
          }
  
          //&lt;/editor-fold&gt;
  
          /* Create and display the form */
          java.awt.EventQueue.invokeLater(new Runnable() {
              public void run() {
                  new agency_auth_gui().setVisible(true);
              }
          });
      }
      // Variables declaration - do not modify                     
  ..
  </code></pre>