RMI学习笔记(1)
RMI(RemoteMethod Invocation):远程方法调用,该技术在Java1.1就已经出现,是一项非常重要的底层技术。
这种技术可以实现Java远程方法的调用,即一个Java虚拟机上的对象可以调用另一个Java虚拟机上的对象的方法。举个简单的例子:有两个Java工程,分别部署在不同的机器上,在A工程中有一个功能,需要从B工程中的某个方法取得数据(如:一台设备的实时监测数据),此时就可以用rmi实现两个工程中方法的远程调用。写个简单的hellworld例子:
1. 在eclipse中创建三个工程,分别为rmiA、rmiB、rmiInterface
说明:rmiA用于远程方法实现
rmiB用于远程调用
rmiInterface用于公共接口
2. 在rmiInterface工程中定义一个远程接口(该接口必须继承Remote类,并且接口中的方法必须抛出RemoteException异常)
① IHelloWorld.java
packagecom.demo.interfaces;
importjava.rmi.Remote;
importjava.rmi.RemoteException;
publicinterface IHelloWorld extends Remote
{
publicvoid sayHelloworld() throws RemoteException;
}
3. 将rmiInterface项目打包成jar文件,分别添加到rmiA、rmiB项目中
4. 实现远程接口(这个实现必须有一个显式的构造函数,并且要抛出RemoteException异常)
② HelloWorldImpl.java
packagecom.rmi.demo.imp;
importjava.rmi.RemoteException;
importjava.rmi.server.UnicastRemoteObject;
importcom.rmi.demo.interfaces.IHelloWorld;
publicclass HelloWorldImpl extends UnicastRemoteObject implements IHelloWorld
{
public HelloWorldImpl() throws RemoteException
{
super();
}
@Override
public void sayHelloworld() throwsRemoteException
{
System.out.println("HelloWorld!");
}
}
5. 新建一个rmi客户端调用程序。
① 创建一个接口的实例
② 创建注册表
③ 绑定对象到远程注册表
ServerStart.java
packagecom.demo.start;
importjava.net.MalformedURLException;
importjava.rmi.AlreadyBoundException;
importjava.rmi.Naming;
importjava.rmi.RemoteException;
importjava.rmi.registry.LocateRegistry;
importcom.demo.imp.HelloWorldImpl;
importcom.demo.interfaces.IHelloWorld;
publicclass ServerStart
{
public static void main(String[] args)
{
try
{
//创建一个远程接口的实例
IHelloWorld helloWorld = newHelloWorldImpl();
//本地主机上的远程对象注册表Registry的实例,并指定端口为8888,这一步必不可少(Java默认端口是1099),必不可缺的一步,缺少注册表创建,则无法绑定对象到远程注册表上
LocateRegistry.createRegistry(8888);
//把远程对象注册到RMI注册服务器上,并命名为helloWorld
Naming.bind("rmi://localhost:8888/helloWorld",helloWorld);
System.out.println("远程服务对象绑定成功---->");
}
catch (RemoteException e)
{
System.out.println("创建远程对象发生异常!");
e.printStackTrace();
}
catch (AlreadyBoundException e)
{
System.out.println("发生重复绑定对象异常!");
e.printStackTrace();
}
catch (MalformedURLException e)
{
System.out.println("发生URL畸形异常!");
e.printStackTrace();
}
}
}
6.编写客户端方法
ClientCall.java
package com.rmi.demo.call;
importjava.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
importcom.rmi.demo.interfaces.IHelloWorld;
public class ClientCall
{
publicstatic void main(String[] args)
{
try
{
IHelloWorldhelloWorld = (IHelloWorld)Naming.lookup("rmi://localhost:8888/helloWorld");
helloWorld.sayHelloworld();
}
catch(MalformedURLException e)
{
e.printStackTrace();
}
catch(RemoteException e)
{
e.printStackTrace();
}
catch(NotBoundException e)
{
e.printStackTrace();
}
}
}
测试:先启动serverstart,然后启动clientcall