Probelams com mini chat em Rmi

1 resposta
I

Olá pessoal, estou com um probleminha num pequeno chat em que estou usando rmi. Fiz um teste com um colega eu cheguei a ver que ele se conectou mas o aplicativo dele ficou todo cinza logo em seguida. Fiz o mesmo teste com varios aplicativos abertos e se conectado em mim mesmo e omesmo problema aconteceu, os aplicativos param de responder. Alguém sabe o que pode ser isso?

Aí vai parte do código:

public void conectar() {

		try {
			
			LocateRegistry.createRegistry(1099);
			String name = "Servidor";
			Naming.rebind(name, remoto);
			clientes.addElement(remoto);
			System.out.println("Registrado no binder");
		} catch (Exception e) {
			System.out.println("Nao pude criar o binder!!!
");
			System.err.println("RemoteException: " + e.getMessage());
			//e.printStackTrace();
		}
	}

isso aí em cima é parte do servidor... ele conecat um UsuarioRemoto no binder q é responsável por distriuir as msgs.

public void adicionarCliente(IUsuarioLocal usuariolocal) {
		this.clientes.addElement(usuariolocal);
		System.out.println(+clientes.size());
	}
Esse código cadastra um novo cliente no servidor.

O cliente se conecta da forma abaixo:

public void conectar(String ip) {
		try {
			registro=LocateRegistry.getRegistry("200.101.29.79", 1099);
			String name = "Servidor";
			//registro=getRegistry
			servidor = (IUsuarioRemoto) registro.lookup(name);

		} catch (RemoteException e) {
			System.err.println("Nao conectei " + e.getMessage());
			e.printStackTrace();
		} catch (NotBoundException e) {
			System.err.println("Nao conectei " + e.getMessage());
			e.printStackTrace();
		} catch (Exception e) {
			System.err.println("Nao conectei " + e.getMessage());
			e.printStackTrace();
		}
	}

ele encontra o UsuarioRemoto, o servidor e passa a usar ele para enviar as mensagens, quando o cliente envia uma mensagem o UsuarioRemoto aciona o servidor pra distribuir as mensagens a todos os clientes.

Alguém tem idéia do quepode estar fazendo o programa para de responder?

[]´s

1 Resposta

dukejeffrie

vc disse cinza? Então vc tá usando Swing? Pelo menos um appletzinho??

Telas cinza são pau de sincronizacao em 99% das apps com Swing.

Ótimo. Vamos combinar assim: tudo o que passa pelo RMI tem que ser:
:arrow: Serializable
:arrow: Model ou valores crus

Por Serializable entende-se não apenas que vc colocou implements Serializable quando declarou a classe, mas que vc pensou em como deve ser serializado esse objeto: o que é persistente, o que não é. Muitas vezes acontece de um objeto ter valores que só fazem sentido na máquina em que ele foi criado. Esses caras devem ser declarados transient

Por Model entende-se que JTable, Jblablabla e correlatos não devem ser enviados de um lado pro outro. Note que eles podem, se forem seriáveis, mas dá bem mais trabalho. Também entende-se que vc não vai enviar eventos, pelo menos não diretamente (desmonta-se um evento aqui, envia-se pro outro lado, e “dispara-se” o evento novamente).

E pelamordedeus, não use a AWTDispatcher pra fazer chamadas remotas. Se vc não sabe onde vc usa e onde não, use o “lindíssimo” método da SwingUtilities isEventDispatchingThread() antes da chamada remota e se for true, vc lança um Error(). Onde vc encontrar isso, vc tem que substituir por uma thread nova, o que pode significar criar Runnables e todo o saco de sempre.

Telas cinza significam que a AWTDispatcher não pode processar eventos porque alguém colocou ela em espera. Isso pode acontecer quando essa thread executa um bloco synchronized, por exemplo.

Bom, espero ter ajudado…
[]s!!

Criado 28 de outubro de 2003
Ultima resposta 30 de out. de 2003
Respostas 1
Participantes 2