远程IP的Java RMI(主机)

用户名

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

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

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

请提供一些示例,说明如何不在同一主机上远程配置RMI。

马亨德拉

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

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  

注意:如果端口已在使用中,则可能需要更改端口。

将您的对象注册到名称为“ calculator”的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)的依赖

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章