gpt4 book ai didi

java - 仅限本地主机的 RMI?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:53:05 31 4
gpt4 key购买 nike

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

我需要能够在我没有更改防火墙规则的权限的 Windows 7 机器上部署这个项目。

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

有没有办法限制 RMI 只监听本地连接?这样 Windows 防火墙就可以很酷了?

或者,是否有一种需要很少功能更改的良好替代 IPC 方法?

干杯。

最佳答案

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

  1. 使用防火墙规则。老实说,这是正常的技术,但它需要在部署期间进行配置。
  2. 使用特殊版本的 RMI 注册表,将限制应用到正确的 IP 地址(即 localhost127.0.0.1),因为 Windows 不会t 提示只能从本地计算机访问的套接字。

这第二个选项是我要勾画出来的。这实际上很简单,因为您可以将大部分复杂性委托(delegate)给现有类。

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 实现之间的唯一区别是它使用客户端和服务器套接字工厂两者的默认值。

关于java - 仅限本地主机的 RMI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9307764/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com