【问题标题】:ObjectInputStream / ObjectOutputStream | client that receive and send a lot of objects (Java)对象输入流 / 对象输出流 |接收和发送大量对象的客户端(Java)
【发布时间】:2013-11-14 11:10:54
【问题描述】:

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

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

我可以在每次需要时发送和接收对象,我需要在我的 Class 上声明 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                     
..

【问题讨论】:

    标签: java swing sockets objectinputstream objectoutputstream


    【解决方案1】:

    根据JavaDoc for ObjectInputStream

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

    编辑

    因此,您似乎没有收到来自另一端的 InputStream 上的任何内容。

    【讨论】:

    • 最后一句话的相关性是什么?
    • 你是对的,这没有意义。我误读了这个例子,并认为流是通过管道传输的,显然它们不是必须的。
    • 明白,但我该怎么做?我应该如何让我的客户根据需要读取和发送尽可能多的对象?
    • 当你的服务器接受客户端时,它还必须发送一个对象作为回报,否则它会阻塞。
    • 不,它没有。但它确实必须在接受套接字时构造一个 ObjectOutputStream。
    【解决方案2】:

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

    【讨论】:

    • 明白,但我该怎么做?我应该如何让我的客户根据需要读取和发送尽可能多的对象?
    • 你必须修复服务器。我不知道为什么这么神秘。
    猜你喜欢
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 2011-02-21
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多