RMI穿透防火墙的问题

RMI除了注册端口外,其通信端口是服务器随机产生的,因此不容易穿过防火墙。解决方法,自定义一个RMISocketFactory,指定固定的通信端口,然后使用setSocketFactory(RMISocketFactory fac)设置。

   import java.rmi.server.*; 
   import java.io.*; 
   import java.net.*; 
   public class SMRMISocket extends RMISocketFactory { 
       public Socket createSocket(String host, int port)  
            throws IOException{ 
            return new Socket(host,port); 
        } 
       public ServerSocket createServerSocket(int port)  
           throws IOException { 
           if (port == 0) 
               port = 2098;//不指定就随机 
           return new ServerSocket(port); 
       } 
   }



try {   
     RMISocketFactory.setSocketFactory(new SMRMISocket());
     LocateRegistry.createRegistry(7112);// 注册端口-----(1)

     System.out.println("客户系统开启rmi 成功!");
    } catch (RemoteException e) {
     System.out.println(e.getMessage());
    }

这样防火墙就需要开启通信端口2098和注册端口7112

另外需要注意的是,在公网上使用RMI时,RMI绑定的ip地址必须是外网地址,不能是内网ip,否则RMI客户端也是无法连接上去的,因为RMI Server在验证连接时会判断客户端请求地址是否跟自己的绑定地址相同。

猜你喜欢

转载自alanhuang.iteye.com/blog/1605154