gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 17:50:35 27 4
gpt4 key购买 nike

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

我想在任何计算机上运行客户端,并且主机将位于一台计算机上,让我们考虑IP - 11.11.11.11。在 1099 上。
但是我怎样才能实现这一点,我应该在客户端的哪里指定我的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) 的依赖

关于用于远程IP(主机)的Java RMI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35403765/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com