Client Server error sending messages

Asked

Viewed 79 times

1

I have the following code however when I run the Server and client and try to send messages from the client (Frame window) of me error! Can anyone help me? The error is supposed to be the class Panel messages in the Submit button in 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

inserir a descrição da imagem aqui

  • Possible duplicate of Client Server error sending messages

  • Then why did you erase it if it wasn’t duplicate?

  • Only now I realize! Can you help me?

  • 1

    You have posted too much code. But I believe that within the class Panelsfiles the private Socketclient socketClient object is null. So when you call it inside your Nviar.addActionListener boot gives the NPE error (Null Pointer Exception).

  • So what value do you have to assume? You know?

  • It does not have to take value. It has to be instantiated somewhere, according to its logic. Something like this.socketClient = new Socketclient(). Exactly as you do with the message field.

Show 1 more comment

1 answer

1


Within the class Panelling, method create, there is the code below:

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 object is being referenced socketCliente, thus:

this.socketCliente.enviar(this.mensagem);

However, this field is not being instantiated anywhere. Therefore, most likely, your NPE is being generated because of this.

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

this.socketCliente = new SocketCliente();

Note that I am omitting any constructor parameter if it exists.

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

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

String nome = this.mensagem.getNome();
  • I think I get it, so how do I fix this?

  • i put that this.socketCliente = new Client on top of this.socketCliente.send(this.message) and even so when I try to send a message me the same error

  • NPE is an error caused by the programmer. Therefore, you are stopping instantiating something and trying to reference it. Since the reference is null, this happens. If it has no relation to what I said, do a Debug that you will find easily.

  • Yeah, you’re right, I get that part. But I can’t fix the mistake and it’s really important because I’m missing this step for my project to be complete, I just have this mistake that I can’t really fix and I know it’s easy for you

  • u tried to debug your code? Put a breakpoint inside the addActionListener and see step-by-step at which point this snippet is giving the error. We can’t help more than that. We’d need the code running and still understand its logic. Therefore, doubts need to have very well defined scope.

  • Yes I’ve tried I know that the mistake is simple and that can help me in a minute I can’t and explain better

  • can’t give me your email to help me?

  • last tip: I saw that in the Panel constructor?

Show 4 more comments

Browser other questions tagged

You are not signed in. Login or sign up in order to post.