Java 远程 ip(主机)的 RMI
Java RMI for remote ip (host)
我是新手。我无法正确理解 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 注册表,这样您就可以将您的对象注册到此注册表,并且更好地 运行 将它放在您放置 classes 的位置,否则您将得到 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 class 从服务器复制到客户端计算机,这样您就可以在编译客户端代码时将其设置为 class 路径。
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 地址:提供给 Naming.lookup().
的查找字符串
[除非您遇到 RMI FAQ 项目 A.1 中提到的 Linux 问题。]
我是新手。我无法正确理解 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 注册表,这样您就可以将您的对象注册到此注册表,并且更好地 运行 将它放在您放置 classes 的位置,否则您将得到 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 class 从服务器复制到客户端计算机,这样您就可以在编译客户端代码时将其设置为 class 路径。
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 地址:提供给 Naming.lookup().
[除非您遇到 RMI FAQ 项目 A.1 中提到的 Linux 问题。]