2011-03-10 76 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

相關問題