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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。