[英]Determining ip of java rmi remote object host machine using rmi registry
[英]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注冊表,以便您可以將對象注冊到此注冊表中,最好在放置類的位置運行它,否則會得到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地址即可:提供給Naming.lookup().
的查找字符串Naming.lookup().
[除非您遇到RMI常見問題A.1中提到的Linux問題。]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.