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