分布式计算——远程对象和远程方法的调用
来源:互联网 发布:牛菲特软件 编辑:程序博客网 时间:2024/06/16 13:00
分布式计算中有个远程方法的调用,在此基础上有个作业是在调用的远程方法中传递两个参数,
一个参数是本地对象,一个参数是远程对象。
下面就对这次的作业结果进行整理。
作业的要求如下:Java RMI远程方法调用实验:若一个方法是远程调用,其参数一是本地对象、参数二是远程对象,请实现程序,
在三台计算机上执行该程序,观察实验现象,报告实验结果。
作业要求图:
==============================================================分割线
以下是部署过程:
因为需要三台计算机来实现,所以我是这么分布的。
计算机A作为客户端,也就是图中的机器A。
计算机B作为远程对象端 ,也就是图中的机器B。
计算机C作为服务器段,也就是图中的机器C。
在计算机A上的代码是这么部署的(共有四个文件):
LocalObj.java——用于生成本地对象
SomeClient.java(主文件)——本地客户端,用于连接远程对象和调用远程方法
SomeInterface.java(接口)——远程对象的存根,调用的远程方法为此接口实现对象的方法,其对象实现于机器C
RemoteObj.java(接口)——远程对象的存根,仅用于调用远程对象,其对象实现于机器B
在计算机B上的代码是这么部署的(共有三个文件):
SomeServer.java——B机器上的主文件,负责绑定对象和注册地址
RemoteObj.java(接口)——A机器上需要调用对象在B机器上的骨架
RemoteObjImpl.java——接口Remote的实现
在计算机C上的代码是这么部署的(共有五个文件):
SomeServer.java——C机器上的主文件,负责绑定对象和注册地址,以及方法的调用过程
RemoteObj.java(接口)——A机器上需要调用对象在C机器上的骨架
SomeInterface.java(接口)——A机器上需要调用的方法在C机器上的骨架
LocalObj.java——A机器上传递过来的本地对象在C机器上的骨架
SomeImple.java——A机器所调用的远程方法在C机器上的实现,也就是SomeInterface接口的实现
==============================================================分割线
以下是代码和一些供人理解的注释:(重复的代码不再贴出)
--------------------------------------------------------------------------小分割线
计算机A上的代码:
SomeClient.java:
import java.rmi.Naming;import java.rmi.Remote;import java.rmi.server.RemoteObject;public class SomeClient {public static void main(String[] args){try{String portNum = "";//定义rmi端口,如果为空,默认是1099LocalObj lo = new LocalObj("wmn", 18);//本地对象的实例化,传递两个参数名字和年龄//以下是远程调用地址的初始化,上面是机器C的IP,下面机器B的IPString registryURL = "rmi://222.24.59.190:" + portNum + "/some";String registryURLro = "rmi://222.24.59.37:" + portNum + "/some";//以下是调用过程//h保存机器C中对象,通过h来调用机器C中实现的方法SomeInterface h = (SomeInterface)Naming.lookup(registryURL);//ro保存机器B中的对像,在通过h调用远程方法的时候需要将ro作为参数传递过去RemoteObj ro = (RemoteObj)Naming.lookup(registryURLro);//someMethod1(),就是调用的远程方法,此方法在机器A中没有实现,是在机器C中实现的String message = h.someMethod1(lo, ro);//lo是本地对象,ro是远程对象int num = h.someMethod2(2);//此处是测试的另一个远程方法System.out.println(message+" "+num);//将执行结果打印出来。}catch(Exception ex){ex.printStackTrace();}}}LocalObj.java:
import java.io.Serializable;public class LocalObj implements Serializable{String name;int age;public LocalObj(String name, int age){//本地的对象只是赋值两个属性,不做其他操作this.name = name;this.age = age;}}SomeInterface.java
import java.rmi.*;public interface SomeInterface extends Remote {public String someMethod1(LocalObj lo, RemoteObj ro) throws java.rmi.RemoteException;public int someMethod2(int someParameter) throws java.rmi.RemoteException;}RemoteObj.java
import java.rmi.Remote;public interface RemoteObj extends Remote{public String someMethod3() throws java.rmi.RemoteException;}
--------------------------------------------------------------------------小分割线
计算机B上的代码:SomeServer.java:
import java.rmi.Naming;import java.rmi.RemoteException;import java.rmi.registry.LocateRegistry;import java.rmi.registry.Registry;public class SomeServer {public static void main(String[] args){String protNum = "";//初始化端口String registryURL;//初始化urlint RMIPortNum = 1099;//初始化远程端口try{RemoteObjImpl remoteObjImpl = new RemoteObjImpl();//接口对象的实现startRegistry(RMIPortNum);//开始注册,将远程端口1099传递进去registryURL = "rmi://222.24.59.37:" + protNum + "/some";Naming.rebind(registryURL, remoteObjImpl);//将registryURL绑定到远程对象exportedObjSystem.out.println("Some Server ready.");}catch(Exception ex){System.out.println("Exception in SomeServer.main" + ex);}}private static void startRegistry(int RMIPortNum) throws RemoteException{try{Registry registry = LocateRegistry.getRegistry(RMIPortNum);String[] list = registry.list();//System.out.println(list.toString());}catch(Exception ex){System.out.println("RMI registry cannot be localhost at prot " + RMIPortNum);Registry registry = LocateRegistry.createRegistry(RMIPortNum);System.out.println("RMI registry created at prot " + RMIPortNum);}}}
RemoteObj.java(同机器A中一样)
RemoteObjImpl.java:
import java.io.Serializable;import java.rmi.RemoteException;import java.rmi.server.UnicastRemoteObject;public class RemoteObjImpl extends UnicastRemoteObject implements Serializable ,RemoteObj {protected RemoteObjImpl() throws RemoteException {super();}@Overridepublic String someMethod3() throws RemoteException {return "Hello";}}
--------------------------------------------------------------------------小分割线
计算机C上的代码:
import java.rmi.Naming;import java.rmi.RemoteException;import java.rmi.registry.LocateRegistry;import java.rmi.registry.Registry;public class SomeServer {public static void main(String[] args){String protNum = "";//初始化端口String registryURL;//初始化urlint RMIPortNum = 1099;//初始化远程端口try{SomeImpl exportedObj = new SomeImpl();//接口对象的实现startRegistry(RMIPortNum);//开始注册,将远程端口1099传递进去registryURL = "rmi://222.24.59.190:" + protNum + "/some";Naming.rebind(registryURL, exportedObj);//将registryURL绑定到远程对象exportedObjSystem.out.println("Some Server ready.");}catch(Exception ex){System.out.println("Exception in SomeServer.main" + ex);}}private static void startRegistry(int RMIPortNum) throws RemoteException{try{Registry registry = LocateRegistry.getRegistry(RMIPortNum);String[] list = registry.list();System.out.println(list.toString());}catch(Exception ex){System.out.println("RMI registry cannot be localhost at prot " + RMIPortNum);Registry registry = LocateRegistry.createRegistry(RMIPortNum);System.out.println("RMI registry created at prot " + RMIPortNum);}}}
RemoteObj.java (同机器A中的一样)
SomeInterface.java(同机器A中的一样)
LocalObj.java(同机器A中的一样)
SomeImple.java:
import java.io.Serializable;import java.rmi.RemoteException;import java.rmi.server.UnicastRemoteObject;public class SomeImpl extends UnicastRemoteObject implements Serializable, SomeInterface {public SomeImpl() throws RemoteException{super();}@Overridepublic String someMethod1(LocalObj lo, RemoteObj ro) throws RemoteException {lo.age = 24;//此处将A中传递进来的age改为24,以便证明确实将对象的属性改变了return lo.name+lo.age + ro.someMethod3();//此处返回ro.someMethod3(),来证明C机器调用B机器中方法是成功的}@Overridepublic int someMethod2(int someParameter) throws RemoteException {int i = 6;i++;i = i*someParameter;return i;}}
=======================================================分割线结果的截图就不贴了
=======================================================分割线
注意问题:
三个计算机上的文件的包路径必须都相同。
- 分布式计算——远程对象和远程方法的调用
- java分布式对象——远程方法中的参数和返回值+远程对象激活
- Remoting,调用远程对象的方法时就报错。
- 远程方法调用传递对象
- 一种远程对象调用方法
- Storm的分布式的远程方法调用(DRPC)
- C#中的远程执行和分布式计算
- Java Remote Method Invocation(Java远程方法调用)-- Java分布式计算白皮书
- VC中调用XMLHTTP对象访问远程数据的方法
- weblogic——远程/近程调用EJB的方法总结
- 远程调用shell的方法
- java的远程方法调用
- webservice的远程调用方法
- 远程方法调用——RMI
- 浅析“远程对象调用”
- 浅析“远程对象调用”
- DWR 调用远程方法的错误和异常处理
- 安卓中调用用本地服务和远程服务的方法
- 正则表达式示例
- 【FZU 2215】Simple Polynomial Problem
- 【day0404 C++】类的成员函数
- JavaScript反选-全选-全不选代码
- 线性表的
- 分布式计算——远程对象和远程方法的调用
- KNN算法
- 典型的错误码和错误信息匹配代码------本质就是key value匹配
- bzoj 1095
- MarkDown 行首缩进
- 复位windows网络参数的方法
- android开发之应用Crash自动抓取Log_自动保存崩溃日志到本地
- << React Native 入门与实战>>----第3章 常用组件及实战
- ecshop:Warning: strpos(): Empty delimiter in E:\WebRoot\...\includes\lib_main.php on line1995