有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用于远程ip(主机)的Java RMI

我是新手。我不能正确理解RMI。互联网上有很多教程,但据我所知,所有教程都是为本地主持人准备的。服务器和客户端都在同一台机器上运行

< P>我想在任何机器上运行客户机,主机将在一台计算机上,让我们考虑^ {CD2>}。在1099
但是我如何才能做到这一点,我应该在哪里在客户端指定我的IP呢。据我所知,使用了命名转换,就像DNS一样,但无论如何,当我需要远程连接到某台机器时,我至少需要知道IP地址(+掩码)和端口

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

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


共 (2) 个答案

  1. # 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  
    

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

    将您的对象注册到名为“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。策略并复制以下内容

    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)的依赖关系

  2. # 2 楼答案

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

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