2011-03-10 28 views
2

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

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。 欢迎任何帮助,非常感谢!

回答

2

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

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

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

+0

谢谢你的回复!它只是我还是implAccept标记为最终?你能否添加一些更多的信息?谢谢 ! – AndrewBourgeois 2011-03-10 18:59:11

+1

@iDemmel你说得对,我误解了文档,它是'accept()',你应该重写。 – biziclop 2011-03-10 19:04:07

+0

public socket accept()throws IOException {true} {socket} socket = super.accept(); String ip = socket.getInetAddress()。getHostAddress(); (ip.equals(“192.168.2.246”)|| ip.equals(“127.0.0.1”)){ return socket; } socket.close(); } } – AndrewBourgeois 2011-03-10 20:10:45

相关问题