仅限本地主机的RMI?

Fli*_*irs 3 java firewall ipc rmi localhost

我有一个启动第二个JVM的项目.目前我正在使用RMI在两者之间进行通信.在我自己的机器上运行良好.

我需要能够在Windows 7计算机上部署此项目,我无权更改防火墙规则.

注册表(从高任意端口上的第一个JVM内启动)被阻止在这些计算机上打开服务器套接字.

有没有办法限制RMI只听本地连接; 这样Windows防火墙会很酷吗?

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

干杯.

Don*_*ows 6

这比起初看起来更棘手.需要的是限制注册表正在侦听的IP 地址,而不是端口.问题是RMI注册表实现程序(rmiregistry)实际上没有提供任何机制来限制它侦听的IP地址; 它始终监听每个可用的网络接口.限制这种情况只有两种实用机制:

  1. 使用防火墙规则.这是正常的技术,但它需要在部署期间进行配置.
  2. 使用该限制适用于恰到好处的IP地址RMI注册的一个特殊版本(即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());
    }
}
Run Code Online (Sandbox Code Playgroud)

这和正常之间的唯一区别rmiregistry实现是一个使用默认值在客户端和服务器套接字工厂.