Ola pessoal, tenho uma duvida, tenho uma aplicação que envia dados para um servidor utilizando RMI, são 4 clientes conectados enviando dados para esse servidor, como faço para que os clientes fiquem com uma conexão aberta aguardando atualizações enviadas do servidor. Então meus clientes já mandam informações pro servidor, eu quero que eles também recebam atualizações vindas do servidor apos cada uma dessas operações. Preciso que a janela de todos os clientes cliente se atualizem conforme o servidor enviar essas atualizações para todos eles.
Obrigado desde ja pela atenção
Olha, nunca usei RMI, mas você pode usar uma thread para cada conexão cliente/servidor. Esta thread ficaria verificando mensagens vindas do servidor e, se a mensagem for atualizar determinado atributo, cada cliente o faria. Se tiver dúvidas quanto ao uso da Interface Thread, coloque aí.
Abraço
Opa, bom dia! Então como que eu faço pra criar um thread que fique rodando no cliente monitorando o servidor para mudanças? SEgue o codigo da classe principal do cliente que precisa ter um thread rodando junto para manipular seus elementos, tais como labels e text area no cliente? Nunca trabalhei com threads, como faço para que o thread consiga manipular esses elementos por exemplo ele consegueria dar um contentPane.repaint() na tela do cliente pra atualizar ? Estou meio perdido…
Estude um pouco de JMS acho que pode resolver seu problema, indico a implementação ActiveMQ da apache.
flws
[quote=fantomas]Estude um pouco de JMS acho que pode resolver seu problema, indico a implementação ActiveMQ da apache.
flws
[/quote]
Pelo que vi do JMS é mais utilizado para soluções web não é? O meu cliente/servidor são aplicações desktop…
Se o Servidor tem que disparar informação para o cliente… seu servidor teria que virar cliente dos clientes. Mas é inviavel…
Faça um serviço no servidor que receba uma idCliente e torne sua atualização…
E no cliente um serviço que acesse o sevidor de tempo em tempo em busca de atualizações…
Assim você pode usar a mesma conexão RMI que já usa.
entao no aplicativo cliente eu tenho um botao iniciar que atualiza as propriedades dos componentes da janela segue o codigo desse botao :
o placar eh um RMI que puxa os dados do servidor
btnEnviar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
lblPos1.setText(placar.getNome(1) + " = "+ placar.getPontos(1));
lblPos2.setText(placar.getNome(2) + " = "+ placar.getPontos(2));
lblPos3.setText(placar.getNome(3) + " = "+ placar.getPontos(3));
lblPos4.setText(placar.getNome(4) + " = "+ placar.getPontos(4));
avatarP1.setBounds(avatarPos.moveAvatar(1, placar.getPontos(1)));
avatarP2.setBounds(avatarPos.moveAvatar(2, placar.getPontos(2)));
avatarP3.setBounds(avatarPos.moveAvatar(3, placar.getPontos(3)));
avatarP4.setBounds(avatarPos.moveAvatar(4, placar.getPontos(4)));
contentPane.repaint();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
});
Preciso de ajuda em como fazer essas atualizacoes serem automaticas, para que por exemplo a cada minuto seja executado e busque essas novas informacoes do servidor, alguem pode dar uma luz em relacao a isso? Obrigado desde ja!!!
Faça uma Thread que concorra com a execução do seu programa para fazer a mesma ação o actionListener…
Dica… evite chamada RMI repetidas… eu sistemas grandes… pode dar problema de desempenho… (Assimndo que o OBJETO PLACAR seja uma inteface de conexão RMI)
lblPos1.setText(placar.getNome(1) + " = "+ placar.getPontos(1)); //Chamada igual placar.getPontos(1)
blPos2.setText(placar.getNome(2) + " = "+ placar.getPontos(2));
lblPos3.setText(placar.getNome(3) + " = "+ placar.getPontos(3));
lblPos4.setText(placar.getNome(4) + " = "+ placar.getPontos(4));
avatarP1.setBounds(avatarPos.moveAvatar(1, placar.getPontos(1))); //Chamada igual placar.getPontos(1)
avatarP2.setBounds(avatarPos.moveAvatar(2, placar.getPontos(2)));
avatarP3.setBounds(avatarPos.moveAvatar(3, placar.getPontos(3)));
avatarP4.setBounds(avatarPos.moveAvatar(4, placar.getPontos(4)));
Duvida… porque vc colocou o actionListener com uma Theard???
Então tudo foi criado com o Windowbuilder dentro do eclipse, quando adiciono um botão e dou dois cliques nele, ele criou a ação sozinho, eu apenas coloquei o código dentro do mesmo.