rmi调用原理,java rmi教程

  rmi调用原理,java rmi教程

  如何解决写爬虫IP受阻的问题?立即使用。

  我们先来看看Java RMI的定义:

  RMI(远程方法调用)在JDK1.2中用Java实现,大大增强了Java开发分布式应用的能力。作为一种流行的网络开发语言,Java的强大之处体现在其强大的开发分布式网络应用的能力上,而RMI是开发100%纯Java网络分布式应用系统的核心解决方案之一。其实可以看作是RPC的Java版。但是传统的RPC不能很好地应用于分布式对象系统。Java RMI支持存储在不同地址空间的程序级对象之间的通信,实现远程对象之间的无缝远程调用。

  RMI远程调用步骤

  RMI交互图:

  RMI由三部分组成,第一部分是RMI Registry(JDK提供的可以独立运行的程序,在bin目录下),第二部分是服务器端程序,对外提供远程对象,第三部分是客户端程序,要调用远程对象的方法。

  首先,启动rmiregistry服务。启动时,可以指定服务监听的端口,也可以使用默认端口(1099)。

  其次,服务器先在本地实例化一个提供服务的实现类,然后通过RMI等类提供的Naming/Context/Registry的bind或rebind方法在rmiregistry上注册刚刚实例化的实现类,对外公开一个名字。

  最后,客户端通过本地接口和一个已知名称(即rmiregistry公开的名称)从RMIService获取实现类,然后使用RMI提供的Naming/Context/Registry的查找方法。这样,虽然这个类没有本地实现类,但是所有的方法都在接口中,这样就可以实现远程调用对象的方法。

  以及存根骨干网的具体通信流程:

  方法调用从客户机对象向下通过存根、远程引用层和传输层到达主机,然后再次通过传输层,向上通过远程调用层和框架到达服务器对象。

  存根充当远程服务器对象的代理,因此客户端可以激活该对象。

  远程引用层处理语义,管理单个或多个对象的通信,并决定是将调用发送到一个服务器还是多个服务器。

  传输层管理实际的连接,并跟踪可以接受方法调用的远程对象。

  主干网完成对服务器对象的实际方法调用,并获得返回值。

  返回值通过远程引用层和服务器端传输层向下传递给客户端,然后通过传输层和远程调用层向上传递。最后,存根得到返回值。

  JAVA RMI的简单例子

  这个例子是客户端调用服务器端远程对象的加减法。具体步骤如下:

  1.定义远程接口。

  导入Java . RMI . remote;

  导入Java . RMI . remote exception;

  /**

  *远程接口必须被继承。

  *所有参数和返回类型都必须序列化(因为网络传输)。

  *任何远程对象都必须实现该接口。

  *只能调用远程接口中指定的方法。

  */

  公共接口IRemoteMath扩展远程{

  //所有方法都必须引发RemoteException

  public double add(double a,double b)抛出RemoteException

  public double subtract(double a,double b)抛出RemoteException

  }(学习视频分享:java视频教程)

  2.远程接口实现类

  导入Java . RMI . remote exception;

  导入Java . RMI . server . unicastremoteobject;

  导入远程。IRemoteMath

  /**

  *服务器端实现远程接口。

  *必须继承UnicastRemoteObject以允许JVM创建远程存根/代理。

  */

  公共类RemoteMath扩展UnicastRemoteObject实现IRemoteMath {

  私有int numberOfComputations

  受保护的RemoteMath()抛出RemoteException {

  number of computations=0;

  }

  @覆盖

  公共double add(double a,double b)抛出RemoteException {

  计算次数;

  System.out.println(到目前为止执行的计算次数=

  计算次数);

  返回(a b);

  }

  @覆盖

  公共双减法(双a,双b)抛出RemoteException {

  计算次数;

  System.out.println(到目前为止执行的计算次数=

  计算次数);

  返回(甲-乙);

  }

  }3.服务器端

  导入Java。RMI。注册表。定位注册表;

  导入Java。RMI。注册表。注册表;

  导入远程100 . IRemoteMath

  /**

  * 创建远程数学类的实例并在无线电磁指示器(Radio Magnetic Indicator的缩写)注册表中注册。

  */

  公共类RMIServer {

  公共静态void main(String[] args) {

  尝试{

  //注册远程对象,向客户端提供远程对象服务。

  //远程对象是在远程服务上创建的,你无法确切地知道远程服务器上的对象的名称,

  //但是,将远程对象注册到无线电磁指示器(Radio Magnetic Indicator的缩写)注册表之后,

  //客户端就可以通过无线电磁指示器(Radio Magnetic Indicator的缩写)注册表请求到该远程服务对象的存根,

  //利用烟蒂代理就可以访问远程服务对象了。

  IRemoteMath远程数学=新远程数学();

  找到注册表。创建注册表(1099);

  注册表注册表=定位注册表。获取注册表();

  registry.bind(Compute ,远程数学);

  System.out.println(数学服务器就绪);

  //如果不想再让该对象被继续调用,使用下面一行

  //unicastremoteobject。unexportobject(远程数学,false);

  } catch(异常e) {

  e。printstacktrace();

  }

  }

  }4.客户端

  导入Java。RMI。注册表。定位注册表;

  导入Java。RMI。注册表。注册表;

  导入远程100 . IRemoteMath

  公共类MathClient {

  公共静态void main(String[] args) {

  尝试{

  //如果无线电磁指示器(Radio Magnetic Indicator的缩写)注册表就在本地机器上,网址就是:RMI://本地主机:1099/你好

  //否则,网址就是:rmi://RMIService_IP:1099/hello

  注册表registry=定位注册表。获取注册表(“localhost”);

  //从登记处中检索远程对象的存根/代理

  IRemoteMath远程数学=(IRemoteMath)注册表。lookup(“Compute”);

  //调用远程对象的方法

  double addResult=远程数学。添加(5.0,3.0);

  系统。出去。println( 5.0 3.0= addResult);

  double sub结果=远程数学。减法(5.0,3.0);

  System.out.println(5.0 - 3.0=子结果);

  }catch(异常e) {

  e。printstacktrace();

  }

  }

  }结果如下:

  计算机网络服务器端

  客户端

  参考:https://博客。csdn。net/xing hun _ 4/文章/详情/45787549

  相关推荐:java入门教程以上就是Java RMI远程调用步骤分析的详细内容,更多请关注我们其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: