簡體   English   中英

僅限本地主機的RMI?

[英]Localhost-only RMI?

我有一個啟動第二個JVM的項目。 目前我正在使用RMI在兩者之間進行通信。 在我自己的機器上運行良好。

我需要能夠在Windows 7計算機上部署此項目,我無權更改防火牆規則。

注冊表(從高任意端口上的第一個JVM內啟動)被阻止在這些計算機上打開服務器套接字。

有沒有辦法限制RMI只聽本地連接; 這樣Windows防火牆會很酷嗎?

或者,是否有一個很好的替代IPC方法,幾乎​​不需要功能改變?

干杯。

這比起初看起來更棘手。 需要的是限制注冊表正在偵聽的IP 地址 ,而不是端口。 問題是RMI注冊實現程序( rmiregistry )實際上並沒有提供任何機制來限制它監聽的IP地址; 它始終監聽每個可用的網絡接口。 限制這種情況只有兩種實用機制:

  1. 使用防火牆規則。 這是正常的技術,但它需要在部署期間進行配置。
  2. 使用特殊版本的RMI注冊表將限制應用於正確的IP地址(即localhost127.0.0.1 ),因為Windows 不會抱怨只能從本地計算機訪問的套接字。

第二個選項是我要草擬的。 這實際上非常簡單,因為您可以將大部分復雜性委托給現有的類。

import java.io.IOException;
import java.net.*;
import java.rmi.server.*;
import java.rmi.registry.LocateRegistry;

public class RestrictedRMIRegistry implements RMIServerSocketFactory {
    public static void main(String... args) throws IOException {
        int port = (args.length == 0 ? 1099 : Integer.parseInt(args[0], 10));
        RMIClientSocketFactory csf = RMISocketFactory.getDefaultSocketFactory();
        RMIServerSocketFactory ssf = new RestrictedRMIRegistry();

        LocateRegistry.createRegistry(port, csf, ssf);
    }

    public ServerSocket createServerSocket(int port) throws IOException {
        // Tricky bit; make a server socket with bound address
        return new ServerSocket(port, 0, InetAddress.getLocalHost());
    }
}

這和正常之間的唯一區別rmiregistry實現是一個使用默認設置客戶端和服務器套接字工廠。

好的替代方案稱為HTTP上的Web服務,通​​常為出站連接打開。

問題在於入站連接。 我相信“正確”的架構是當防火牆后面部署的進程通過第三個進程相互通信時 - 服務器安裝在不限制入站HTTP連接的地方。 因此,防火牆后面的2個組件僅執行到服務器的出站HTTP連接。

嘗試在啟動注冊表(或您的方案中涉及的任何其他Java進程)時將java.rmi.server.hostname屬性設置為127.0.0.1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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