2016-05-07 3 views
0

Я изучаю RMI, и я создал базовую программу, которая использует кодовую базу.RMI с различными ПК

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

Клиент:

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

Клиент не имеет интерфейса 's2int' и который загружается из кодовых. Команды, используемые для запуска сервера и клиентские модули являются следующие:

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 

Теперь, это работает, когда и клиент и сервер находятся на одном компьютере, но когда я попытался запустить его на другом компьютере на в той же сети, у меня есть

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 

Я не очень хорошо разбираюсь в сетевых отношениях. Может ли кто-нибудь объяснить, почему он не работает?

ответ

1

Ваш клиент ищет неправильный реестр. Он должен искать реестр на хосте сервера, а не свой собственный localhost.

+0

Как я могу это сделать? Должен ли я передать общедоступный IP-адрес хоста сервера методу lookup()? - Я пробовал, но это не сработало. –

+0

Ой, подождите, оказывается, я ввел неправильный IP-адрес. Я ввел IP-адрес из ifconfig и теперь работает. –

+0

Вам следует подумать над тем, чтобы вы могли найти и/или принять ответы, которые вы найдете здесь полезными. – EJP

Смежные вопросы