rmi实现,rmi编程

  rmi实现,rmi编程

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

  Rmi指的是远程方法调用。它是一种机制,使一个Java虚拟机中的对象能够调用另一个Java虚拟机中的对象的方法。任何可以用此方法调用的对象都必须实现远程接口。(推荐:java视频教程)

  Java RMI并不是一项新技术(在Java1.1时代就已经存在),但却是一项非常重要的底层技术。

  众所周知的EJB都是基于rmi的,现在也有一些开源的远程调用组件,其底层技术就是rmi。

  在大力提倡Web服务和SOA的时代,是不是每个应用都应该用笨拙的Web服务组件来实现?经过对比测试,RMI最简单,最适合一些小型应用。

  下面是一个简单的例子来说明RMI的原理和应用。下面的例子是一个简单的HelloWorld,但是它涵盖了RMI的核心应用和开发模式。

  /**

  *由IntelliJ IDEA创建。

  *用户:雷志民

  日期:2008年8月7日21时50分02秒

  *定义一个远程接口,必须继承远程接口,需要远程调用的方法必须抛出RemoteException异常。

  */

  公共接口IHello扩展远程{

  /**

  *只需返回“Hello World!单词。

  * @return返回“Hello World!单词。

  * @ throws Java . RMI . remote exception

  */

  公共字符串helloWorld()引发RemoteException

  /**

  *一种简单的商业方法,根据来电者的姓名回复相应的问候语。

  * @param someBodyName name

  * @return返回相应的问候语。

  * @ throws Java . RMI . remote exception

  */

  公共字符串sayhellotoosomeone(String somebody name)抛出RemoteException

  }/**

  *由IntelliJ IDEA创建。

  *用户:雷志民

  日期:2008年8月7日21时56分47秒

  *远程接口实现

  */

  公共类HelloImpl扩展UnicastRemoteObject实现IHello {

  /**

  *因为UnicastRemoteObject的构造函数抛出了RemoteException异常,所以这里必须写默认的构造函数,并且必须声明抛出了RemoteException异常。

  *

  * @抛出RemoteException

  */

  公共HelloImpl()引发RemoteException {

  }

  /**

  *只需返回“Hello World!单词。

  *

  * @return返回“Hello World!单词。

  * @ throws Java . RMI . remote exception

  */

  公共字符串helloWorld()引发RemoteException {

  返回“你好,世界!”;

  }

  /**

  *一种简单的商业方法,根据来电者的姓名回复相应的问候语。

  *

  * @param someBodyName name

  * @return返回相应的问候语。

  * @ throws Java . RMI . remote exception

  */

  公共字符串sayhellotoosomeone(String somebody name)引发RemoteException {

  回复“你好,某人的名字!”;

  }

  }/**

  *由IntelliJ IDEA创建。

  *用户:雷志民

  日期:2008年8月7日22时03分35秒

  *创建RMI注册表,启动RMI服务,并在RMI注册表中注册远程对象。

  */

  公共类HelloServer {

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

  尝试{

  //创建远程对象

  IHello RH ello=new hello impl();

  //本地主机上远程对象注册表的实例,并将端口指定为8888。这一步是必不可少的(Java默认端口是1099),而且是必不可少的一步。如果不创建注册表,对象就无法绑定到远程注册表。

  locate registry . create registry(8888);

  //在RMI注册服务器上注册远程对象,并将其命名为RHello。

  //绑定URL的标准格式是rmi://host:port/name(这里可以省略协议名,下面两种方式是正确的)

  naming . bind( RMI://localhost:8888/RHello ,RHello);

  //naming . bind(//localhost:8888/RHello ,RHello);

  System.out.println(INFO:远程IHello对象绑定成功!);

  } catch(远程异常e) {

  System.out.println(创建远程对象时出现异常!);

  e . printstacktrace();

  } catch(AlreadyBoundException e){

  System.out.println(出现重复绑定对象异常!);

  e . printstacktrace();

  } catch(malformedurexception e){

  System.out.println(出现URL格式不正确的异常!);

  e . printstacktrace();

  }

  }

  }/**

  *由IntelliJ IDEA创建。

  *用户:雷志民

  日期:2008年8月7日22时21分07秒

  *客户端测试,在客户端调用远程对象的远程方法并返回结果。

  */

  公共类HelloClient {

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

  尝试{

  //在RMI服务注册表中查找名为RHello的对象,并对其调用方法。

  IHello RHello=(IHello)naming . lookup( RMI://localhost:8888/RHello );

  system . out . println(rhello . hello world());

  system . out . println(RH hello . sayhellotoosomeone( lava ));

  } catch (NotBoundException e) {

  e . printstacktrace();

  } catch(malformedurexception e){

  e . printstacktrace();

  } catch(远程异常e) {

  e . printstacktrace();

  }

  }

  }运行RMI服务器程序:

  运行RMI客户端程序:

  总结:

  从上面的过程来看,RMI非常依赖服务器的IP地址和端口,但是我在开发的时候并不知道服务器未来的IP和端口,但是客户端程序依赖于这个IP和端口。

  这也是RMI的局限性之一。解决这个问题有两种方法:一种是通过DNS解决,另一种是通过封装将IP暴露给程序代码。

  RMI的第二个限制是RMI是Java语言的远程调用,两端的编程语言必须用Java实现。对于不同语言之间的通信,可以考虑Web服务或公共对象请求代理系统(CORBA)。

  更多java知识,请关注java基础课程专栏。以上是Java RMI的详细介绍(有例子)。请多关注我们的其他相关文章!

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

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