2017-12-11 7 views
0

私はRMI経由で互いに通信する2つのサーバーを持っています。 localhostでテストしようとしていますが、このエラーはスローされます。RMI - java.rmi.ConnectException:接続が拒否されました:localhost、System.setProperty( "java.rmi.server.hostname"、IP)を使用中

私はSystem.setProperty("java.rmi.server.hostname", IP);System.setProperty("java.rmi.server.hostname","localhost");を使用しようとしましたが、まだこのエラーが発生します。

私は他のサーバーがRMI経由でProxyServerまたはDatanodeServerにcomunicateしているため、このエラーがスローされないため、これらのサーバーになぜこのようなことが起こるのかわかりません。

ProxyServer.java

public class ProxyServer implements Proxy { 

private static int port = 7001; 

public static void main(String[] args) { 

    try { 
     String IP = localIP(); 
     System.setProperty("java.rmi.server.hostname", IP); 

     ProxyServer obj = new ProxyServer(); 
     Proxy stub = (Proxy) UnicastRemoteObject.exportObject(obj, port); 

     Registry registry = LocateRegistry.createRegistry(port); 
     registry.bind("Proxy", stub); 

     System.out.println("Server ready!"); 

    } catch (Exception e) { 
     System.err.println("Server exception: " + e.toString()); 
     e.printStackTrace(); 
    } 

} 

@Override 
public void create(String file, String text) { 
    try {      
     Registry namenodeRegistry = LocateRegistry.getRegistry("localhost", NamenodeServer.getPort()); 
     Namenode namenodeStub = (Namenode) namenodeRegistry.lookup("Namenode"); 
     namenodeStub.addFile(file); 
     int id = getDatanodeID(file);   
     Registry datanodeRegistry = LocateRegistry.getRegistry("localhost", 5000 + id); 
     Datanode datanodeStub = (Datanode) datanodeRegistry.lookup("Datanode" + String.valueOf(id)); 
     datanodeStub.create(file, text); 

    } catch (RemoteException e) { 
     e.printStackTrace(); 
    } catch (NotBoundException e) { 
     e.printStackTrace(); 
    } 
} 
// other methods 

DatanodeServer.java

public class DatanodeServer implements Datanode { 
private int port; 
private int id; 

public DatanodeServer(int id) { 
    this.id = id; 
    this.port = 5000 + id; 
} 

public static void main(String[] args) { 

    Scanner sc = new Scanner(System.in); 
    System.out.print("Datanode id: "); 
    int id = sc.nextInt(); 

    try {   
     System.setProperty("java.rmi.server.hostname", "192.168.1.2"); 

     DatanodeServer obj = new DatanodeServer(id); 
     Datanode stub = (Datanode) UnicastRemoteObject.exportObject(obj, obj.getPort()); 

     Registry registry = LocateRegistry.createRegistry(obj.getPort()); 
     registry.rebind("Datanode" + String.valueOf(id), stub); 

     System.out.println("Servidor pronto!"); 

    } catch (Exception e) { 
     System.err.println("Server exception: " + e.toString()); 
     e.printStackTrace(); 
    } 
} 

// Create file 
@Override 
public void create(String fileName, String text) { 
    Path file = Paths.get("datanode" + String.valueOf(this.id) + "/" + fileName); // Converte uma String em um Path 
    Charset charset = Charset.forName("UTF-8"); 
    try (BufferedWriter writer = Files.newBufferedWriter(file, charset, StandardOpenOption.CREATE)) { 
     writer.write(text, 0, text.length()); 
     Registry proxyRegistry = LocateRegistry.getRegistry("localhost", ProxyServer.getPort()); 
     Proxy proxyStub = (Proxy) proxyRegistry.lookup("Proxy"); 
     proxyStub.sendToClient("Arquivo " + fileName + ".txt criado!"); 
     } catch (IOException x) { 
     System.err.format("IOException: %s%n", x); 
    } catch (NotBoundException e) { 
      e.printStackTrace(); 
     } 
} 
// other methods 

エラーでproxy.ProxyServer.createで - 65:データノードdatanodeStub =(データノード)datanodeRegistry.lookup( "データノード" +文字列.valueOf(id));

java.rmi.ConnectException: Connection refused to host: localhost; nested exception is: 
    java.net.ConnectException: Connection refused (Connection refused) 
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619) 
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216) 
    at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202) 
    at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:338) 
    at sun.rmi.registry.RegistryImpl_Stub.lookup(RegistryImpl_Stub.java:112) 
    at proxy.ProxyServer.create(ProxyServer.java:65) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357) 
    at sun.rmi.transport.Transport$1.run(Transport.java:200) 
    at sun.rmi.transport.Transport$1.run(Transport.java:197) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.Transport.serviceCall(Transport.java:196) 
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 
    at java.lang.Thread.run(Thread.java:748) 
Caused by: java.net.ConnectException: Connection refused (Connection refused) 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
    at java.net.Socket.connect(Socket.java:589) 
    at java.net.Socket.connect(Socket.java:538) 
    at java.net.Socket.<init>(Socket.java:434) 
    at java.net.Socket.<init>(Socket.java:211) 
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40) 
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:148) 
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613) 
    ... 22 more 

答えて

0

createRegistry()の結果を静的変数に格納する必要があります。さもなければ、ガベージコレクションされる可能性があります。

+0

rmiに問題はありませんでした。問題は、datanode idを取得する方法に問題があったため、プロキシが間違ったポートでレジストリを検索しようとしていました。おそらくこの質問を削除するつもりです –

関連する問題