Problema com Sockets + interface gráfica

0 respostas
Avelino7

Boa tarde a todos!

Bem pessoal, estou implementando um exemplo do Deitel utilizando sockets para fazer um chat de Cliente>>Servidor (e vice-versa).
Estou fazendo a interface gráfica pelo designer do NetBeans, e a princípio ele não parece ter nenhum erro, mas quando executo,
dou um clique no botão "Conectar" e, ele simplesmente trava.

Gostaria de saber o que eu posso estar fazendo errado. Agradeço a atenção.

Segue o projeto do NetBeans em anexo:

Segue o código do lado do Cliente:

package redes;

import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;

public class TelaCliente extends javax.swing.JFrame {

    ObjectOutputStream output;
    ObjectInputStream input;
    String message = "";
    String nome = "Cliente";
    String ip = "localhost";
    int porta = 5050;

    public TelaCliente() {
        initComponents();
        tx_resultado.setEditable(false);
        tx_escreva.setEnabled(false);
        bt_enviar.setEnabled(false);
    }

    public void Inicia() {

        Socket client;
        try {
            tx_resultado.setText("Aguardando conexão...\n");
            client = new Socket(InetAddress.getByName(ip), porta);
            tx_resultado.append("Conectado a: " + client.getInetAddress().getHostName());
            output = new ObjectOutputStream(client.getOutputStream());
            output.flush();
            input = new ObjectInputStream(client.getInputStream());
            tx_escreva.setEnabled(true);
            bt_enviar.setEnabled(true);

            do {
                try {
                    message = (String) input.readObject();
                    tx_resultado.append("\n" + message);
                    tx_resultado.setCaretPosition(tx_resultado.getText().length());
                } catch (ClassNotFoundException cnfex) {
                    tx_resultado.append("\nNenhuma mensagem recebida.");
                }
            } while (!message.equals("Servidor: TERMINATE"));

            tx_resultado.append("Fechando conexão....\n");
            output.close();
            input.close();
            client.close();
        } catch (EOFException eof) {
            System.out.println("O servidor encerrou a conexão.");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            bt_enviar.setEnabled(true);
            tx_escreva.setEnabled(true);
        }
    }

    public void EnviaDados(String s) {
        try {
            message = s;
            output.writeObject(nome + ": " + s);
            output.flush();
            tx_resultado.append("\n" + nome + ": " + s);
        } catch (IOException cnfex) {
            tx_resultado.append("\nErro ao enviar os dados. É possível que o Servidor tenha se desconectado.");
        } finally {
            bt_enviar.setEnabled(true);
            tx_escreva.setEnabled(true);
        }
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        tx_ip = new javax.swing.JTextField();
        jLabel2 = new javax.swing.JLabel();
        tx_porta = new javax.swing.JTextField();
        tx_nome = new javax.swing.JTextField();
        jLabel3 = new javax.swing.JLabel();
        bt_conectar = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        tx_resultado = new javax.swing.JTextArea();
        bt_enviar = new javax.swing.JButton();
        tx_escreva = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Cliente");
        setLocationByPlatform(true);
        setResizable(false);

        jLabel1.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        jLabel1.setText("IP:");

        tx_ip.setText("localhost");

        jLabel2.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        jLabel2.setText("Porta:");

        tx_porta.setText("5050");

        tx_nome.setText("Cliente");

        jLabel3.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        jLabel3.setText("Nome:");

        bt_conectar.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        bt_conectar.setText("Conectar");
        bt_conectar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bt_conectarActionPerformed(evt);
            }
        });

        tx_resultado.setColumns(20);
        tx_resultado.setRows(5);
        jScrollPane1.setViewportView(tx_resultado);

        bt_enviar.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        bt_enviar.setText("Enviar");
        bt_enviar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bt_enviarActionPerformed(evt);
            }
        });

        tx_escreva.setText("Escreva aqui.");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(tx_ip, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel2)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(tx_porta, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel3)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(tx_nome)
                            .addComponent(bt_conectar, javax.swing.GroupLayout.DEFAULT_SIZE, 106, Short.MAX_VALUE)))
                    .addComponent(jScrollPane1)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(tx_escreva)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(bt_enviar)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(tx_ip, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel2)
                    .addComponent(tx_porta, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel3)
                    .addComponent(tx_nome, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(bt_conectar)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 188, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(bt_enviar)
                    .addComponent(tx_escreva, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );

        pack();
    }// </editor-fold>

    private void bt_conectarActionPerformed(java.awt.event.ActionEvent evt) {
        //nome = tx_nome.getText();
        porta = Integer.parseInt(tx_porta.getText());
        ip = tx_ip.getText();
        Inicia();
        bt_conectar.setEnabled(false);
    }

    private void bt_enviarActionPerformed(java.awt.event.ActionEvent evt) {
        EnviaDados(tx_escreva.getText());
        bt_enviar.setEnabled(false);
    }

    public static void main(String args[]) {

        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Metal".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(TelaCliente.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(TelaCliente.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(TelaCliente.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(TelaCliente.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new TelaCliente().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private javax.swing.JButton bt_conectar;
    private javax.swing.JButton bt_enviar;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextField tx_escreva;
    private javax.swing.JTextField tx_ip;
    private javax.swing.JTextField tx_nome;
    private javax.swing.JTextField tx_porta;
    private javax.swing.JTextArea tx_resultado;
    // End of variables declaration
}

[size=14]E do lado do Servidor:[/size]

package redes;

import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TelaServidor extends javax.swing.JFrame {

    ObjectOutputStream output;
    ObjectInputStream input;
    int porta = 5050;
    String nome = "Servidor";

    public TelaServidor() {
        initComponents();
        setLocationRelativeTo(null);
        tx_resultado.setEditable(false);
        tx_escreva.setEnabled(false);
        bt_enviar.setEnabled(false);
    }

    public void Inicia() {
        ServerSocket server;
        Socket connection;
        int counter = 1;
        try {
            server = new ServerSocket(porta, 100);
            while (true) {
                tx_resultado.setText("Aguardando conexão...\n");
                connection = server.accept();
                tx_resultado.append("Conexão " + counter + " recebida de: "
                        + connection.getInetAddress().getHostName());
                output = new ObjectOutputStream(connection.getOutputStream());
                output.flush();
                input = new ObjectInputStream(connection.getInputStream());
                String message = nome + ": Conectado com Sucesso!";
                output.writeObject(message);
                output.flush();
                tx_escreva.setEnabled(true);
                bt_enviar.setEnabled(true);

                do {
                    try {
                        message = (String) input.readObject();
                        tx_resultado.append("\n" + message);
                        tx_resultado.setCaretPosition(tx_resultado.getText().length());
                    } catch (ClassNotFoundException cnfex) {
                        tx_resultado.append("\nNenhuma mensagem recebida.");
                    }
                } while (!message.equals("Cliente: TERMINATE"));

                tx_resultado.append("\nO Cliente encerrou a conexão.");
                bt_conectar.setEnabled(false);
                output.close();
                input.close();
                connection.close();
                ++counter;
            }
        } catch (EOFException eof) {
            System.out.println("O Cliente encerrou a conexão.");
        } catch (IOException io) {
            io.printStackTrace();
        } finally {
            bt_enviar.setEnabled(true);
            tx_escreva.setEnabled(true);
        }
    }

    public void EnviaDados(String s) {
        try {
            output.writeObject(nome + ": " + s);
            output.flush();
            tx_resultado.append("\n" + nome + ": " + s);
        } catch (IOException cnfex) {
            tx_resultado.append("\nErro ao enviar os dados. É possível que o Cliente tenha se desconectado.");
        } finally {
            bt_enviar.setEnabled(true);
            tx_escreva.setEnabled(true);
        }
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jLabel3 = new javax.swing.JLabel();
        tx_porta = new javax.swing.JTextField();
        jLabel2 = new javax.swing.JLabel();
        bt_enviar = new javax.swing.JButton();
        tx_nome = new javax.swing.JTextField();
        jScrollPane1 = new javax.swing.JScrollPane();
        tx_resultado = new javax.swing.JTextArea();
        bt_conectar = new javax.swing.JButton();
        tx_escreva = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Servidor");
        setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
        setResizable(false);

        jLabel3.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        jLabel3.setText("Nome:");

        tx_porta.setText("5050");

        jLabel2.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        jLabel2.setText("Porta:");

        bt_enviar.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        bt_enviar.setText("Enviar");
        bt_enviar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bt_enviarActionPerformed(evt);
            }
        });

        tx_nome.setText("Servidor");

        tx_resultado.setColumns(20);
        tx_resultado.setRows(5);
        jScrollPane1.setViewportView(tx_resultado);

        bt_conectar.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        bt_conectar.setText("Conectar");
        bt_conectar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bt_conectarActionPerformed(evt);
            }
        });

        tx_escreva.setText("Escreva aqui.");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane1)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel2)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(tx_porta, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel3)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(tx_nome)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(bt_conectar, javax.swing.GroupLayout.PREFERRED_SIZE, 91, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(tx_escreva, javax.swing.GroupLayout.DEFAULT_SIZE, 308, Short.MAX_VALUE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(bt_enviar)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(bt_conectar)
                    .addComponent(jLabel2)
                    .addComponent(tx_porta, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel3)
                    .addComponent(tx_nome, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 197, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(bt_enviar)
                    .addComponent(tx_escreva, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    private void bt_conectarActionPerformed(java.awt.event.ActionEvent evt) {
        //nome = tx_nome.getText();
        porta = Integer.parseInt(tx_porta.getText());
        Inicia();
        bt_conectar.setEnabled(false);
    }

    private void bt_enviarActionPerformed(java.awt.event.ActionEvent evt) {
        EnviaDados(tx_escreva.getText());
        bt_enviar.setEnabled(false);
    }

    public static void main(String args[]) {

        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Metal".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(TelaServidor.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(TelaServidor.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(TelaServidor.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(TelaServidor.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }

        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new TelaServidor().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private javax.swing.JButton bt_conectar;
    private javax.swing.JButton bt_enviar;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextField tx_escreva;
    private javax.swing.JTextField tx_nome;
    private javax.swing.JTextField tx_porta;
    private javax.swing.JTextArea tx_resultado;
    // End of variables declaration
}
Criado 24 de novembro de 2012
Respostas 0
Participantes 1