2016-05-07 10 views
0

Ich lerne RMI und ich machte ein Basisprogramm, das Codebasis verwendet.RMI mit verschiedenen PCs

import java.rmi.registry.LocateRegistry; 
import java.rmi.registry.Registry; 
import java.rmi.server.UnicastRemoteObject; 

public class Server implements sInterface,s2int { 

public void go() 
{ 
    System.out.println("GO"); 
} 
public void doIt() 
{ 

} 

public static void main(String[] args) 
{ 
    if(System.getSecurityManager()==null) 
    { 
     System.setSecurityManager(new SecurityManager()); 
    } 
    try 
    { 
    System.setProperty("java.rmi.server.hostname","helios"); 
     String s = "SERVER"; 
     Registry r = LocateRegistry.getRegistry(); 

     sInterface stub = (sInterface) UnicastRemoteObject.exportObject(new Server(),0); 
     r.rebind(s,stub); 

    }catch(Exception x){x.printStackTrace();} 
} 
} 

Auftraggeber:

public class Client { 

public static void main(String[] args) 
{ 
    if(System.getSecurityManager()==null) 
    { 
     System.setSecurityManager(new SecurityManager()); 
    } 

    try{ 

     String name = "SERVER"; 
     Registry r = LocateRegistry.getRegistry(args[0]); 
     sInterface inf = (sInterface)r.lookup(name); 
     inf.go(); 

    }catch(Exception x) 
    { 
     x.printStackTrace(); 
    } 
} 
} 

Client nicht 's2int' -Schnittstelle und die von der Code-Basis heruntergeladen wird. Die Befehle verwendet, um den Server und die Client-Module zu starten, sind wie folgt:

java -Djava.rmi.server.codebase=http://helios/~owner/rmi.jar 
-Djava.security.policy=server.policy Server   


java -Djava.security.policy=client.policy  
-Djava.rmi.server.codebase=http://helios/~owner/  
-Djava.rmi.server.hostname=helios Client localhost 

Nun, dies funktioniert, wenn der Server und Client auf demselben PC, aber wenn ich versuchte, es auf einem anderen PC läuft auf das gleiche Netzwerk, ich habe eine

java.rmi.ConnectException: Connection refused to host: localhost; 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.newCall(Unknown Source) 
    at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source) 
    at Client.main(Client.java:20) 
Caused by: java.net.ConnectException: Connection refused: connect 
    at java.net.DualStackPlainSocketImpl.connect0(Native Method) 
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) 
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) 
    at java.net.AbstractPlainSocketImpl.connect(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.<init>(Unknown Source) 
    at java.net.Socket.<init>(Unknown Source) 
    at   
sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown S 
ource) at  
sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown S 
ource) 
    ... 6 more 

Ich bin nicht sehr gut informiert, wenn es um Vernetzung geht. Kann jemand erklären, warum es nicht funktioniert?

Antwort

1

Ihr Client sucht nach der falschen Registrierung. Es muss die Registrierung auf dem Server-Host suchen, nicht seinen eigenen localhost.

+0

Wie kann ich das tun? Muss ich die öffentliche IP-Adresse des Serverhosts an die lookup() -Methode übergeben? - Ich habe es versucht, aber es hat nicht funktioniert. –

+0

Oh, warte, es stellte sich heraus, dass ich die falsche IP-Adresse eingegeben habe. Ich habe die IP-Adresse von ifconfig eingegeben und es funktioniert jetzt. –

+0

Sie sollten Upvoting und/oder akzeptieren von Antworten, die Sie hier nützlich finden. – EJP