Callback

5 respostas
P

Tenho 1 vetor q registra todos os clientes logados. Tb tenho 1 lado para quando 1 novo cliente logar ele usa o metodos cli.addChatNick(nome);
em todos os clientes. O meu problema eh q o nick da pessoa logada n eh adicionada na lista do chat de todos os clientes e sim somente do proprio cliente q logou.
Mas a linha de codigo: System.out.print(cli.getNick());
imprimi todos os nicks de clientes registrados, provando q os clientes realmente estao corretamente registrados.

Obs: O metodo addChatNick adiciona o nome na lista de pessoas logadas! (DefaultModelList).

public void Registrar(String nome, Cliente cliente) {
		try{
			Cliente cli;
			clientCallbacks.addElement(cliente);
			cliente.setNick(nome);
			for (Enumeration client = clientCallbacks.elements(); client.hasMoreElements();){
				cli = (Cliente) client.nextElement();
				cli.addChatNick(nome);
				System.out.print(cli.getNick());
			}
			
		}catch (RemoteException e){
			e.getStackTrace();
		}

	}

5 Respostas

G

Cara,

o objeto clientCallbacks é um objeto só(uma collection,imagino) que está sendo compartilhada por todos os clientes?

como está a arquitetura desse seu sistema?

P

n esta sendo compartilhada por todos clientes n… a função desse vector eh registrar todos os clientes, assim quando o servidor precisar mandar 1 informação para todos clientes registrados (logados) ele usa esse vector… pelo menos eh a ideia.
No caso estou usando 1 programa para ser servidor e 1 programa clientes programas diferentes.

L

Então… vc tah usando rmi certo?! então vc tem clientes rodando em maquinas separadas do servidor?! quando vc registra o cliente no servidor vc envia ele passando algo como registra(this) certo?? e ai no servidor vc grava tudo numa lista e quando outro eh registrado, vc informa todos clientes?!

tah, assim, pelo que lembro, no rmi, quando vc faz a chamada remota, vai serializar o objeto e vai passar para o servidor, no servidor vai des-serializar, e montar o objeto de novo. Então o que vc vai ter no servidor eh a copia do seu cliente, e naum o mesmo cliente, invocações remotas é passado valor e não a referencia do objeto. Logo, o que vc alterar no cliente da lista no servidor, naum vai alterar no cliente real. O que vc tem que fazer eh transformar cada cliente seu em um “servidor”, e registrar no seu servidor de chat a referencia remota desse seu cliente, cuja interface remota define um método como addChatNick(nome), ai sim, vc ao inves de ter uma lista de clientes, vai ter uma lista de referencias remota de clientes, que permite executar um método addCharNick, e cada vez que um cliente se registrar no servidor, o servidor vai comunicar cada um dos clientes que ele tem gravado na lista de referencia de clientes remotos. Outra alternativa eh fazer o cliente pedir por atualizações periodicamente, tipo a cada 5 min, dessa, não tem comunicação servidor->cliente apenas cliente->servidor e o servidor não precisa informar nada para o cliente caso não seja pedido.

Ou então, eheh eu tava justamente procurando esse topico e ah la, era seu tb heheh vc chegou a ler aquelas coisas que o jairElton falou?! Eu não li os links que ele passou, então não sei certinho como se aplica, mas se vc seguir deve conseguir…

O topico eh este http://www.portaljava.com/home/modules.php?name=Forums&file=viewtopic&t=33687&highlight=callback
E no post ele comenta isso:


phiny, pelo que eu entendi, você quer que o servidor envie as mensagens para os clientes automaticamente, para isso você precisará implementar uma estrategia de Callback:

http://java.sun.com/developer/onlineTraining/rmi/RMI.html#RMIClientSideCallbacks
http://www.dca.fee.unicamp.br/cursos/PooJava/objdist/rmicallback.html

Ou simplesmente criar um repositório de mensagens, e os clientes fazerem requisições de tempos em tempos, para atualizar suas mensagens…

[/quote]

P

eu entendi o q vc flw, porem esses links n me ajudaram muito… vc n tem 1 link com exemplos melhores e mais detalhados?
Eu fiz deste jeito pq eu tava lendo la no forum da sun e o cara tava com o memso problema e deram + ou - essa solução para ele XD!

Vlw pela força!

Edit:

Saca so o exemplo do link q ele postou:

Servidor:

public interface Count extends Remote {
.
.
.
  void addClient(CountClientInterface client) throws RemoteException;
}

Cliente chama o metodo addCount, passando ele mesmo por parametro!

Count remCount;
.
.
.
remCount.addClient(this);

No servidor ele recebe o cliente e adiciona em 1 vetor, dps faz 1 lanco para usar o metodo .update !

private Vector clientes = new Vector();
.
.
.
public void addClient(CountClientInterface client) throws RemoteException {
    clientes.add(client);
}
.
.
.
private void notify() throws RemoteException {
    CountClientInterface cci;
    for (int i=0; i<clientes.size(); ++i) {
      cci = (CountClientInterface) clientes.elementAt(i);
      cci.update(sum);
    }
 }

O exemplo q ele me passou ta igualzinho o q eu fiz, porem o q eu fiz n esta funcionando!! =[!

P

doidoooo a parada n estava funcionando… n sei o q eu fiz… agora ta funcionando !!! iauiauiauia eh ilário… tentei fazer 1 coisa la dae n deu certo e voltei como era antes e agora funciona!!!

Criado 14 de novembro de 2006
Ultima resposta 16 de nov. de 2006
Respostas 5
Participantes 3