LocateRegistry.createRegistry

时间:2011-03-10 18:15:09

标签: java rmi

我需要一个RMI注册表,可以从我的机器外部访问该服务,同时仍然能够根据客户端的IP拒绝连接。以下代码使注册表只能从我的机器访问,但永远不会进入“RMIClientSocketFactory”代码:

LocateRegistry.createRegistry(uri.getPort(), new RMIClientSocketFactory() {
            @Override
            public Socket createSocket(String host, int port) throws IOException {
                System.out.println("RMIServerSocketFactory().createSocket()");
                InetAddress addr = InetAddress.getByName(host);
                if (addr.equals(InetAddress.getLocalHost())) {
                    return new Socket(addr, port);
                } else {
                    throw new IOException("remote socket bind forbidden.");
                }
            }
        }, new RMIServerSocketFactory() {
            @Override
            public ServerSocket createServerSocket(int port) throws IOException {
                System.out.println("RMIServerSocketFactory().createServerSocket()");
                return new ServerSocket(port, 0, InetAddress.getByName("127.0.0.1"));
            }
        });

因此它运行“RMIServerSocketFactory”并绑定环回,但从不验证客户端IP。 欢迎任何帮助,非常感谢!

1 个答案:

答案 0 :(得分:2)

客户端套接字工厂不是您需要的。

您需要的是ServerSocket拒绝来自不受欢迎的IP的连接。实现此目的的最简单方法是创建ServerSocket的子类,该子类重写accept()方法以立即关闭来自不需要的IP的连接并抛出异常。

然而,有更好的,低级别的方法来控制网络访问,我不认为你的应用程序加倍作为防火墙(这基本上是你需要的)是一个特别好的主意。