例如 我门实际的业务类 可能是这样的
public interface bussinessInter extends Remotepublic class bussinessClass extends UnicastRemoteObject implements
        bussinessInter 将 bussinessClass  注册到一台服务器机器上,假设用默认端口然后 客户端在调用 bussinessInter 的方法的时候,
RMI服务器又会使用一个端口和客户端 通讯我的意思是bussinessClass  注册时用了一个端口。这个我们称这个 为 通讯端口,或查找端口,因为命名服务需要来查找它的
假设这个端口是10000
但是和客户端通讯时又用了一个端口。这是实际业务上用的端口,我们称之为数据端口
假设这个端口是10001即客户端通过服务器上10000这个端口找到bussinessClass  但是调用bussinessClass  的方法并且获取相应数据是10001端口而RMISocketFactory 就是来指定这个数据端口,如果不指定,这个端口就会随意分配,
因为有些主机并不是所有端口都开放,所以需要去指定这个理解对吗?请大吓指教啊

解决方案 »

  1.   

    答:大致正确。若你“需要去指定”,则:
    1)从RMISocketFactory继承,重写你自己的createServerSocket(int port) 与createSocket(String host, int port) 
    2)用setSocketFactory(RMISocketFactory fac) 向RMI运行时 进行注册就行了。
    说明:RMI的默认实现是当TCP连接直接连接时被“防火墙”封锁时,可自动用HTTP协议尝试进行访问。
    所谓的从注册服务器中找到“bussinessClass ”,其实返回的是一个实现该远程接口bussinessClass 的一个代理类而已。当客户调用“远程方法”时,该代理类的对象自动通过网络向“远程服务对象”传递该“远程方法调用”。通常默认实现是由一个“远程服务对象代理”在一个端口号上监听(这是由程序用:exportObject(..)时产生),并将请求转发到真正的“远程对象”上。以上仅供你参考