【问题标题】:Java RMI for remote ip (host)用于远程 ip(主机)的 Java RMI
【发布时间】:2016-05-26 00:46:49
【问题描述】:

我是新手。我无法正确理解RMI。互联网上有大量教程可用,但据我所知,它们都是针对本地主机的。服务器和客户端都运行在同一台机器上。

我想在任何机器上运行客户端并且主机将在一台计算机上让我们考虑IP - 11.11.11.11。在1099.
但是我该如何实现这一点,我应该在客户端的哪里指定我的 IP。据我了解,使用了命名转换,例如 DNS,但无论如何,当我需要远程连接到某些机器时,我至少需要知道 IP 地址(+掩码)和端口。

我想我错过了一些非常重要的事情。

请举例说明如何在不同主机上远程配置RMI。

【问题讨论】:

  • 如果服务器在 11.11.11.11:1090 上运行,您可以将其硬编码到客户端中,或者添加手动更改 ip 的可能性。当然,您也可以连接到域,因此底层 ip 可能会改变。
  • 你能举个例子吗?这应该如何正确完成。因为我只找到了 localhost 的示例
  • Oracle Java 教程的 RMI 部分不限于 localhost,,您应该优先查看它而不是所有其他教程。

标签: java ip rmi rpc


【解决方案1】:

首先您必须设置一个服务器,其方法或对象可以被任何远程客户端访问 下面是服务器的示例代码。

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface MyCalc extends Remote{
    int add(int a, int b) throws RemoteException;
}




import java.rmi.RemoteException;

public class MyCalcImpl implements MyCalc {

    @Override
    public int add(int a, int b) throws RemoteException {
        return (a + b);
    }
}

在服务器机器上启动 rmi 注册表,这样您就可以将您的对象注册到此注册表,并且最好在您放置类的地方运行它,否则您将获得 ClassNotFound。

    rmiregistry 1099  

注意:如果端口已被使用,您可能需要更改端口。

使用名称“计算器”将您的对象注册到 rmi 注册表。

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

public class MyRMIServer {
    public static void main(String[] args) throws Exception {

        System.setProperty("java.security.policy","file:///tmp/test.policy");

        if (System.getSecurityManager() == null) {
            System.setSecurityManager(new SecurityManager());
        }
        try {
            String name = "Calculator";
            MyCalc engine = new MyCalcImpl();
            MyCalc stub = (MyCalc) UnicastRemoteObject.exportObject(engine, 0);
            Registry registry = LocateRegistry.getRegistry(1099);
            System.out.println("Registering Calculator Object");
            registry.rebind(name, stub);
        } catch (Exception e) {
            System.err.println("Exception:" + e);
            e.printStackTrace();
        }
    }
}

注意:要运行程序,您必须设置一个安全策略文件并为此创建一个文件,例如test.policy 并复制以下内容。

grant {
    permission java.security.AllPermission;
    permission java.net.SocketPermission "localhost:1099", "connect, resolve";
    permission java.net.SocketPermission "127.0.0.1:1099", "connect, resolve";
    permission java.net.SocketPermission "localhost:80", "connect, resolve";
};

您可以根据自己的情况更改 IP 和端口。

启动服务器后,假设你的服务器的IP地址是11.11.11.11,那么你可以在服务器上调用MyCalc的add()。因此,在您的客户端计算机上,您的客户端代码将如下所示:

将 MyCalc 类从服务器复制到客户端计算机,以便在编译客户端代码时将其设置到类路径。

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

public class MyRMIClient {
    public static void main(String args[]) {

        System.setProperty("java.security.policy","file:///tmp/test.policy");

        if (System.getSecurityManager() == null) {
            System.setSecurityManager(new SecurityManager());
        }
        try {
            String name = "Calculator";
            String serverIP = "11.11.11.11"; // or localhost if client and server on same machine.
            int serverPort = 1099;
            Registry registry = LocateRegistry.getRegistry(serverIP, serverPort);
            MyCalc mycalc = (MyCalc) registry.lookup(name);
            int result = mycalc.add(10, 20);
            System.out.println("Result:" + result);
        } catch (Exception e) {
            System.err.println("ComputePi exception:");
            e.printStackTrace();
        }
    }
}

编译和测试客户端的代码。

编辑:编辑以删除对 rmi 编译器 (rmic) 的依赖

【讨论】:

  • RMI 骨架自 1998 年以来已过时,您发布的命令行不会生成。
【解决方案2】:

您只需在一处指定服务器的 IP 地址:提供给 Naming.lookup(). 的查找字符串

[除非您遇到 RMI 常见问题解答项目 A.1 中提到的 Linux 问题。]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-10
    • 2014-05-14
    • 2012-03-22
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    相关资源
    最近更新 更多