簡體   English   中英

遠程IP的Java 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注冊表,以便您可以將對象注冊到此注冊表中,最好在放置類的位置運行它,否則會得到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM