RMI - java.rmi.ConnectException:连接拒绝主机:localhost,同时使用System.setProperty(“java.rmi.server.hostname”,IP)

时间:2017-12-11 16:30:47

标签: java rmi

我有两台服务器通过RMI相互通信。我正试图在localhost上测试但是抛出了这个错误。

我尝试使用System.setProperty("java.rmi.server.hostname", IP);System.setProperty("java.rmi.server.hostname","localhost");,但我仍然遇到此错误。

我不知道为什么这些服务器会发生这种情况,因为我有其他服务器通过RMI与ProxyServer或DatanodeServer进行通信,并且不会抛出此错误。

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:Datanode datanodeStub =(Datanode)datanodeRegistry.lookup(“Datanode”+ String.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

1 个答案:

答案 0 :(得分:0)

您必须将createRegistry()的结果存储在静态变量中。否则它可以被垃圾收集。

相关问题