[英]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.