首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RMI - java.rmi.ConnectException:使用RMI IP时,拒绝连接到主机: localhost )

RMI - java.rmi.ConnectException:使用RMI IP时,拒绝连接到主机: localhost )
EN

Stack Overflow用户
提问于 2017-12-12 00:30:47
回答 1查看 775关注 0票数 0

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

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

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

ProxyServer.java

代码语言:javascript
复制
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

代码语言:javascript
复制
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(“数据节点”+ String.valueOf(id));

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2017-12-12 02:24:04

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47757274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档