1.1 java.rmi.Remote接口:
远程接口需要满足的条件:必须继承Remote接口,远程方法必须抛出RemoteException异常,
如果远程对象作为远程方法的参数或者返回值——>参数或返回值必须声明为远程接口。
1.2 RemoteException 抛出该异常可能因为以下情况:
交互失败:远程服务器不可达或拒绝连接
在参数或返回值 marshalling 或unmarshalling期间失败
协议错误
1.3 实现Remote接口:
如果不继承UnicastRemoteObject,那就没有hascode()、equals()、toString()方法的自定义
当导出远程对象没有指定socket Factory时,默认导出到所有本地地址
1.4 远程方法的参数或返回值,是远程对象或非远程对象(非远程对象需要实现Serializable接口)
远程对象:如果远程对象已在服务端注册,那么传递的是存根(说明存根实现了Serializable),否则,传递的是这个远程对象实体(看做非远程对象)
非远程对象:传递的是副本,非远程对象的内容,在服务端调用远程对象实体的远程方法之前已经复制好了
1.5 类注释
当一个对象在一次远程方法调用中,从一个JVM传到另一个JVM中,rmi系统用类的信息(类的URL)注释调用流中的类描述,使得这个类能加载给接受者
1.6 在一次远程方法调用中,参数如何传递?
参数被写到ObjectOutputStream流中,RMI的ObjectOutputStream子类会覆写replaceObject(Object obj)方法,用存根代替实体远程对象。
在哪里调用replaceObject方法:在writeObject里面。
算法:如果远程对象已在服务端注册,那么传递存根,否则,传递远程对象实体,如果参数不是Remote实例,则replaceObject()直接返回原对象
MarshalOutputStream是RMI的ObjectOutputStream子类之一,有replaceObject方法和writeLocation方法
1.7