sách gpt4 ai đã đi

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

In lại 作者:行者123 更新时间:2023-12-02 17:50:35 27 4
mua khóa gpt4 Nike

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

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

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

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

1 Câu trả lời

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

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 {

@Ghi đè
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());
}
thử {
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());
}
thử {
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
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com