RMI类和接口(完成一个简单RMI需要用到的类)

 

 

recvfrom 端口_recvfrom 端口

 

 



Remote 接口:是一个不定义方法的标记接口



Public interface Remote{}


在RMI中,远程接口声明了可以从远程Java虚拟机中调用的方法集。远程接口不需满足下列要求:



1、 远程接口必须直接或间接扩展Java.rmi.Remote接口,且必须声明为public,除非客户端于远程接口在同一包中



2、 在远程接口中的方法在声明时,除了要抛出与应用程序有关的一场之外,还必须包括RemoteException(或它的超类,IOExcepion或Exception)异常



3、 在远程方法声明中,作为参数或返回值声明的远程对象必须声明为远程接口,而非该接口的实现类。



 



RemoteObject 抽象类实现了Remote接口和序列化Serializable接口,它和它的子类提供RMI服务器函数



说一点:提供了创建远程对象并将其导出(也就是使他们能够被远程客户机所调用),所需的方法有类UnicastRemoteObject和Activatable提供。子类可以识别远程对象引用的语义,例如服务器是简单的远程对象还是科技获得远程对象



 



LocateRegistry final 用于获得特定主机的引导远程对象注册服务器程序的引用(即创建stub),或者创建能在特定端口接收调用的远程对象注册服务程序



服务器端:向其他客户机提供远程对象服务


SomeService servcie=……;//远程对象服务


Registry registry=LocateRegisty.getRegistry();//Registry是个接口,他继承了Remote,此方法返回本地主机在默认注册表端口 1099 上对远程对象 
    Registry 的引用。


(还有 getRegistry返回本地主机在指定 port 上对远程对象 Registry 的引用; getRegistry返回指定 host 在默认注册表端口 1099 上对远程对象 Registry 的引用; getRegistry返回指定的 hostport 上对远程对象 Registry 的引用)registry.bind(“I serve”,service);// bind( String name, obj) 绑定对此注册表中指定 name 的远程引用。name : 与该远程引用相关的名称 obj : 对远程对象(通常是一个 stub)的引用还有一些unbind(String name)移除注册表中指定name的绑定。rebind( String name, obj)重新绑定,如果name已存在,但是Remote不一样则替换,如果Remote一样则丢弃现有的绑定( String host, int port) ( String


lookup(String返回注册表中绑定到指定 name 的远程引用,返回Remote


客户机端:向服务器提供相应的服务请求。



Registry registry=LocateRegisty.getRegistry();
 
   
SomeService servcie=(SomeService)registry.lookup(“I serve”);
 
   
Servcie.requestService();


 



四、Naming类



和Registry类类似。其中客户端:Naming.lookup(String url)

url 格式如下"rmi://localhost/"+远程对象引用



服务器端:Registry registry=LocateRegistry.createRegistry(int port);



 



        

Naming.rebind(“service”,service);

五、RMISecurityManager



         在RMI引用程序中,如果没有设置安全管理器,则只能从本地类路径加载stub和类,这可以确保应用程序不受由远程方法调用所下载的代码侵害。 



在从远程主机下载代码之前必须执行以下代码来安装RMISecurityManager:



System.setSecurityManager(new RMISecurityManager());

 


转载于:https://blog.51cto.com/gujianting2013/1169775