Client Server error in sending messages

1

I have the following code, however, when I run the server and the client and try to send messages from the client (frame window) of the error! Can someone help me? The error is supposed to be the class Panel messages in the send button on the actionlistener

public class PainelMensagens extends JPanel{
private static final long serialVersionUID = 1L;

private EstadoMensagem estadoMensagem = null;
private JButton botaoEnviar;
private JTextField zonaEscreverMensagens;
private JTextArea zonaReceberMensagens;
private JanelaUtilizador janelaUtilizador;


private Mensagem mensagem;
private SocketCliente socketCliente;


public PainelMensagens(JanelaUtilizador janelaUtilizador) {
    this.janelaUtilizador = janelaUtilizador;

    setLayout(new BorderLayout());
    criarPainelEscrita();
    criarPainelLeitura();
}


private void criarPainelEscrita(){
    JPanel painelEscrita = new JPanel();
    painelEscrita.setLayout(new BorderLayout());

    zonaEscreverMensagens = new JTextField();

    botaoEnviar = new JButton("Enviar");
    botaoEnviar.addActionListener(e->{
        String texto = this.zonaEscreverMensagens.getText();
        String nome = this.mensagem.getNome();

        if(!texto.isEmpty()){
        this.mensagem = new Mensagem();
        this.mensagem.setNome(nome);
        this.mensagem.setMensagem(texto);
        this.mensagem.setAccao(Accao.ENVIAR_TODOS);

        this.socketCliente.enviar(this.mensagem);
        }
        this.zonaEscreverMensagens.setText("");
    });


    painelEscrita.add(zonaEscreverMensagens, BorderLayout.CENTER);
    painelEscrita.add(botaoEnviar, BorderLayout.EAST);

    add(painelEscrita, BorderLayout.SOUTH);
}


private void criarPainelLeitura(){
    zonaReceberMensagens = new JTextArea();
    zonaReceberMensagens.setEditable(false);

    add(zonaReceberMensagens, BorderLayout.CENTER);
}




public EstadoMensagem getEstadoMensagem() {
    return estadoMensagem;
}

public JTextField getZonaEscreverMensagens() {
    return zonaEscreverMensagens;
}

public JTextArea getZonaReceberMensagens() {
    return zonaReceberMensagens;
}

public JanelaUtilizador getJanelaUtilizador() {
    return janelaUtilizador;
}

public JButton getBotaoEnviar() {
    return botaoEnviar;
}
}
public class PainelEstadoContacto extends JPanel{

private static final long serialVersionUID = 1L;

private JanelaUtilizador janelaUtilizador;
private JButton botaoOnline;
private JButton botaoOffline;
private JTextField nomeUtilizador;


private Socket socket;
private Mensagem mensagem;
private SocketCliente socketCliente;


public PainelEstadoContacto(JanelaUtilizador janelaUtilizador) {
    this.janelaUtilizador=janelaUtilizador;

    botaoOnline= new JButton("ONLINE");
    botaoOnline.addActionListener(e -> {
        String nome = nomeUtilizador.getText();

        if(!nome.isEmpty()){
            this.mensagem = new Mensagem();
            this.mensagem.setAccao(Accao.ONLINE);
            this.mensagem.setNome(nome);

            this.socketCliente = new SocketCliente();
            this.socket = this.socketCliente.conectar();

            //Criar thread para iniciar processo
            new Thread(new ListenerSocket(this.socket)).start();
        }
        this.socketCliente.enviar(mensagem);

    });

    botaoOffline=new JButton("OFFLINE");
    botaoOffline.addActionListener(e->{
        this.mensagem.setAccao(Accao.OFFLINE);
        this.socketCliente.enviar(this.mensagem);
        desconectar(mensagem);
    });

    setLayout(new GridLayout(1,3));

    JPanel painel = new JPanel();
    painel.setLayout(new BorderLayout());

    JLabel utilizador = new JLabel("Utilizador:");
    nomeUtilizador = new JTextField();

    painel.add(utilizador, BorderLayout.NORTH);
    painel.add(nomeUtilizador, BorderLayout.SOUTH);

    add(painel);

    add(botaoOnline);
    add(botaoOffline);
}


public JanelaUtilizador getJanelaUtilizador() {
    return janelaUtilizador;
}


private class ListenerSocket implements Runnable {
    private ObjectInputStream input ; 

    public ListenerSocket(Socket socket) {
        try {
            this.input = new ObjectInputStream(socket.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
        } 
    }

    @Override
    public void run() {
        Mensagem mensagem = null;

        try {
            while((mensagem = (Mensagem) input.readObject()) != null){
                Accao accao =  mensagem.getAccao();                 //receber accao por parte do servidor

                if(accao.equals(accao.ONLINE)){
                    conectado(mensagem);
                }else if(accao.equals(accao.OFFLINE)){
                    desconectar(mensagem);
                    socket.close();
                }else if(accao.equals(accao.ENVIAR_UM)){
                    receberMensagem(mensagem);
                }else if(accao.equals(accao.CONTACTOS_ONLINE)){
                    atualizarLista(mensagem);
                }
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


private void conectado(Mensagem mensagem){
    if(mensagem.getMensagem().equals("Não conectado!")){
        this.nomeUtilizador.setText("");
        JOptionPane.showMessageDialog(this, "Conexão sem sucesso \n Introduzir outro nome");
        return ;
    }
    this.mensagem = mensagem;
    //      this.botaoOnline.setEnabled(false);
    //      this.nomeUtilizador.setEditable(false);
    //
    //      this.botaoOffline.setEnabled(true);
    //      
    //      //this.textoEnviado.setEditable(true);
    //      this.janelaUtilizador.getPainelMensagens().getZonaEscreverMensagens().setEditable(true);
    //      
    //      //this.botaoEnviar.setEnabled(true);
    //      this.janelaUtilizador.getPainelMensagens().getBotaoEnviar().setEnabled(true);
    //      //this.botaoAtualizarLista.setEnabled(true);
    //      this.janelaUtilizador.getPainelMensagens()

    //this.textoRecebido.append(mensagem.getNome() + "\n");
    this.janelaUtilizador.getPainelMensagens().getZonaReceberMensagens().append(mensagem.getNome() + "\n");

    JOptionPane.showMessageDialog(this, "Conectado ao QuequeAPP");
}

private void desconectar(Mensagem mensagem){

    this.botaoOnline.setEnabled(true);
    this.nomeUtilizador.setEditable(true);

    this.botaoOffline.setEnabled(false);
    //      this.textoEnviado.setEditable(false);
    //      this.botaoEnviar.setEnabled(false);
    //      this.botaoApagar.setEnabled(false);
    //      this.botaoAtualizarLista.setEnabled(false);

    JOptionPane.showMessageDialog(this, "OFFLINE");
}

private void receberMensagem(Mensagem mensagem){
    //      this.textoRecebido.append(mensagem.getNome() + " diz:" + mensagem.getMensagem() + "\n");
    this.janelaUtilizador.getPainelMensagens().getZonaReceberMensagens().append(mensagem.getNome() + " diz: " + mensagem.getMensagem() + "\n");
}

private void atualizarLista(Mensagem mensagem) {

}
}
public class JanelaUtilizador {

private PainelContactos painelContactos;
private PainelMensagens painelMensagens;
private PainelEstadoContacto painelEstadoContacto;
private JFrame janela;
private Cliente cliente;


public JanelaUtilizador(Cliente cliente){
    this.cliente = cliente;

    painelContactos = new PainelContactos(this);
    painelMensagens = new PainelMensagens(this);
    painelEstadoContacto = new PainelEstadoContacto(this);

    criarJanela();
    janela.validate();
    janela.setVisible(true);
}


public void criarJanela(){
    janela = new JFrame("QuequeApp");

    janela.setLayout(new BorderLayout());

    janela.setLocation(400,100);
    janela.setSize(500, 500);

    janela.add(painelContactos, BorderLayout.WEST);
    janela.add(painelMensagens, BorderLayout.CENTER);
    janela.add(painelEstadoContacto, BorderLayout.NORTH);

    janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    
}



public Cliente getCliente() {
    return cliente;
}

public JFrame getJanela() {
    return janela;
}

public PainelContactos getPainelContactos() {
    return painelContactos;
}

public PainelMensagens getPainelMensagens() {
    return painelMensagens;
} 
}

Error Message

    
asked by anonymous 07.12.2015 / 23:45

1 answer

1

Within the MessagePolicy class, createPelterPath method, there is the following code:

botaoEnviar.addActionListener(e->{
    String texto = this.zonaEscreverMensagens.getText();
    String nome = this.mensagem.getNome();

    if(!texto.isEmpty()){
    this.mensagem = new Mensagem();
    this.mensagem.setNome(nome);
    this.mensagem.setMensagem(texto);
    this.mensagem.setAccao(Accao.ENVIAR_TODOS);

    this.socketCliente.enviar(this.mensagem);
    }
    this.zonaEscreverMensagens.setText("");
});

In this code, the socketClient object is being referenced, like this:

this.socketCliente.enviar(this.mensagem);

However, this field is not being instantiated anywhere. So most likely your NPE is being spawned because of it.

To solve, this object needs to be instantiated, just like you did with the message field, something like this:

this.socketCliente = new SocketCliente();

Note that I am omitting any constructor parameters, if it exists.

Another error can be seen in the same routine above, but in the message field.

The following code snippet is running before instantiating the message object, see:

String nome = this.mensagem.getNome();
    
07.12.2015 / 23:53