1.客户端和服务端分布部署在两个网络中,两个网络之间有硬件防火墙,只允许开放制定端口用于客户端访问服务端。
2.服务端通过某端口(如9999)提供RMI服务,防火墙开放了9999端口,允许客户端通过9999访问服务端
3.测试发现上述处理后,客户端仍然不能调用RMI接口成功
4.经过查询资料,发现客户端在调用RMI接口过程中,首先会利用9999端口请求一个RMI远程对象,然后会利用新的随机的端口同这个RMI远程对象建立连接,进行点对点通讯。
问题就在这里,硬件防火墙只允许开通制定端口,而调用RMI过程的端口时随机分配的。
请较各位有无解决方法?是不是可以做到那个随机端口也能够固定下来?可提供的参考:UnicastRemoteObject的构造函数,一般用的没带参数,但是JDK提供了带端口的参数的构造函数UnicastRemoteObject(int port).我觉得这个应该能解决问题,但是还没试验成功,不太清除要怎么利用这个来弄。

解决方案 »

  1.   

    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 = 1099;
            return new ServerSocket(port);
        }
    }
    你自己写一个类,在实例化rmi对象前调用,即可统一1099和那个随机端口为一个端口
      

  2.   

    如果你固定了端口,当有多个RMI请求的时候,就有问题了
      

  3.   

    哇,看来RMI是自行实现多线程的了???