Java RMI 概观
RMI的好处在于你不必亲自写网络或I/O代码。 客户程序调用远程方法(即真正服务器所在)就和在运行在客户自己本地JVM上对对象进行正常方法调用一样。 RMI将客户辅助对象成为stub(桩),服务辅助对象称为skeleton(骨架) 五个步骤: 1.制作远程接口远程接口定义出可以让客户端远程调用的方法。客户端将用它作为服务的类类型。Stub和实际的服务都实现此接口。 Remote是一个“记号”接口,所以Remote不具有方法。 所有声明的方法都会抛出RemoteException。客户会调用实现远程接口的Stub上的方法,而Stub底层用到了网络和I/O,所以各种坏事请都可能会发生。。。 确定变量和返回值都是属于原语(primitive)类型或者可序列化(Serializable)类型。因为要在网络中传输,所以要序列化。 <span style="color: #008000;">//<span style="color: #008000;"> 远程接口
<span style="color: #0000ff;">public <span style="color: #0000ff;">interface MyRemote <span style="color: #0000ff;">extends<span style="color: #000000;"> Remote { <span style="color: #008000;">//<span style="color: #008000;"> 类的返回值 必须是原语类型 或者 可序列化类型 <span style="color: #0000ff;">public String sayHello() <span style="color: #0000ff;">throws<span style="color: #000000;"> RemoteException; } 2.制作远程的实现一个做实际工作的类。 首先要实现MyRemote接口。 为了成为远程服务对象,需要某些“远程的”功能,最简单的方式是扩展java.rmi.server.UnicastRemoteObject,让超类帮你做这些事情。 由于超类的构造器会抛出一个异常,所以该类也必须有一个构造器。 MyRemoteImpl UnicastRemoteObject MyRemoteImpl()
@Override
</span><span style="color: #0000ff;">public</span> String sayHello() <span style="color: #0000ff;">throws</span><span style="color: #000000;"> RemoteException {
</span><span style="color: #0000ff;">return</span> "Server says,'hey'"<span style="color: #000000;">;
}
} 3.利用rmic产生的stub和skeleton客户和服务的辅助类,不需要自己创建。 我使用Eclipse创建的工程,在工程目录的bin目录下,执行rmic 包名.文件名? 注意,文件名不加.class 然后会发现xxxbin包下会产生一个MyRemoteImpl_Stub.class文件。 如警告处所说,没有骨架生成,也就是没有名为MyRemoteImpl_Skel.class的文件。 4.启动RMI register(rmiregistry)在安装JDK的目录的bin目录下,找到了rmiregistry.exe,但是……不知道怎么用……囧……一直报错,然后放弃了在命令行开启rmiregistry 直接在代码里通过LocateRegistry.createRegistry(12312);创建rmirgistry服务,同时指定端口号。 先产生远程对象,然后通过Naming.rebind()将远程对象绑定到rmiregistry
<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> MyRemoteServer {
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void<span style="color: #000000;"> main(String[] args) { <span style="color: #0000ff;">try<span style="color: #000000;"> { <span style="color: #008000;">//<span style="color: #008000;"> System.out.println(InetAddress.getLocalHost()); <span style="color: #008000;">//<span style="color: #008000;">192.168.61.130 LocateRegistry.createRegistry(12345<span style="color: #000000;">); MyRemote service = <span style="color: #0000ff;">new<span style="color: #000000;"> MyRemoteImpl(); Naming.rebind("rmi://192.168.61.130:12345/RemoteHello"<span style="color: #000000;">,service); } <span style="color: #0000ff;">catch<span style="color: #000000;">(Exception ex) { ex.printStackTrace(); } } } 5.开始远程服务客户端通过Naming.lookup(注册时使用的名字)获得服务。 <span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> MyRemoteClient {
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void<span style="color: #000000;"> main(String[] args) { <span style="color: #0000ff;">new<span style="color: #000000;"> MyRemoteClient().go(); }
} RMI远程调用步骤:
对于客户对象来说,步骤2-6是完全透明的 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |