2013-11-03 78 views
0

我的多线程服务器/客户端项目出现问题。ObjectInputStream/ObjectOutputStream |客户端接收和发送大量对象(Java)

服务器端很好,但问题出在客户端。

我可以发送和接收的对象我想我需要声明一个ObjectInputStreamObjectOutputStream作为我的类属性,然后实例化它们的构造

每次但问题是,代码上阻塞ObjectInputStream实例。

这里是我的代码:

客户:

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); 
     } 

     //</editor-fold> 

     /* 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      
.. 

回答

1

按照JavaDoc for ObjectInputStream

此构造方法将阻塞,直到相应的ObjectOutputStream已写入和刷新了头。

编辑

这样看来,你不从另一端接收的InputStream什么。

+0

最后一句话的相关性是什么? – EJP

+0

你说得对,它没有意义。我误解了这个例子,并认为这些溪流是通过管道输送的,他们显然不需要这样做。 – NilsH

+0

了解,但我怎么做我wana做什么? 我应该如何让我的客户读取并发送尽可能多的对象? – Coldfire

0

显然,当连接被接受时,你的服务器没有构造ObjectOutputStream。不要推迟这一步:它会在构建ObjectInputStream时阻塞客户端。看到Javadoc。

+0

了解,但我怎么能做我wana做的? 我应该如何让我的客户读取并发送尽可能多的对象? – Coldfire

+0

您必须修复服务器。我不知道为什么这是如此神秘。 – EJP

+0

好的,谢谢你的回答 – Coldfire

相关问题