Problemas com rmi em JVMs em computadores diferentes

Boa noite à todos.
Estou estudando rmi, e consigo executar os testes com sucesso em JVMs diferentes no mesmo computador, mas quando tento acessar o método de um computador diferente dá uma exception
Não há firewall nem nada do tipo bloqueando as conexões e não estou usando stubs ou skeletons porque li que no java 6 eles não são mais necessários
Uma coisa curiosa que eu notei usando o iptraf foi que quando invoco o metodo de uma jvm no mesmo computador ela parece redirecionar a requisição para uma outra porta

│┌127.0.0.1:1099		=		0			0           ----              lo                 │
│└127.0.0.1:51642		>		1			52           --A-            lo                 │
│┌127.0.1.1:41722		=		0			0           ----              lo                 │
│└127.0.1.1:49023		>		1			52           --A-           lo     

já em jvms em computadores diferentes ele não faz isso

192.168.0.164:1257		=       9		484		RESET		eth0
│└192.168.0.200:1099	=       7		610		--A-		eth0

A exception
[list]
java.rmi.ConnectException: Connection refused to host: 127.0.1.1; nested exception is:
java.net.ConnectException: Connection refused: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)
at $Proxy0.soma(Unknown Source)
at Cliente.main(Cliente.java:7)
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.(Unknown Source)
at java.net.Socket.(Unknown Source)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)
… 8 more
[/list]

Código da interface que é usada no rmi

import java.rmi.*;

public interface IServico extends Remote {
	public int soma (int a, int b) throws RemoteException;
}

implementação da interface

import java.rmi.*;
import java.rmi.server.*;

public class Servico extends UnicastRemoteObject implements IServico {

	public Servico() throws RemoteException {
	}

	public int soma (int a, int b) throws RemoteException {
		return a + b;
	}
	
}

Código que registra o rmi

import java.rmi.*;

public class Servidor {
	public static void main (String args[]) {
		try {
			IServico servico = new Servico();
			Naming.bind ("Servico", servico);
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}
}

codigo que consome o rmi

import java.rmi.*;

public class Cliente {
	public static void main (String args[]) {
		try {
			IServico servico = (IServico) Naming.lookup("rmi://192.168.0.200/Servico");
			System.out.println (servico.soma(2,3));
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}
}

Cara, eu estava com um problema semelhante, passei dias a fio tentando resolver… Compartilho a solução. No arquivo /etc/hosts, subustitua:

127.0.0.1 localhost
127.0.1.1 JRicardo-Ubuntu-PC

por

127.0.0.1 localhost
192.168.56.1 JRicardo-Ubuntu-PC

Onde 192.168.56.1 é o IP real da máquina!

1 curtida