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();
}
}
}