0

我的多线程服务器/客户端项目有问题。

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

每次我需要在我的类上声明一个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                     
..
4

2 回答 2

1

根据ObjectInputStream 的JavaDoc

此构造函数将阻塞,直到相应的 ObjectOutputStream 已写入并刷新标头。

编辑

因此,您似乎没有InputStream从另一端收到任何东西。

于 2013-11-03T20:21:48.860 回答
0

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

于 2013-11-03T20:25:53.823 回答