[英]Localhost-only RMI?
我有一個啟動第二個JVM的項目。 目前我正在使用RMI在兩者之間進行通信。 在我自己的機器上運行良好。
我需要能夠在Windows 7計算機上部署此項目,我無權更改防火牆規則。
注冊表(從高任意端口上的第一個JVM內啟動)被阻止在這些計算機上打開服務器套接字。
有沒有辦法限制RMI只聽本地連接; 這樣Windows防火牆會很酷嗎?
或者,是否有一個很好的替代IPC方法,幾乎不需要功能改變?
干杯。
這比起初看起來更棘手。 需要的是限制注冊表正在偵聽的IP 地址 ,而不是端口。 問題是RMI注冊實現程序( rmiregistry
)實際上並沒有提供任何機制來限制它監聽的IP地址; 它始終監聽每個可用的網絡接口。 限制這種情況只有兩種實用機制:
localhost
, 127.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.