1.Java RMI:java远程方法调用(Rmote Method Invocation)。简单的说,RMI是指Java虚拟机上的对象调用另外一个Java虚拟机上的对象的方法。
RMI实现步骤:
1.编写服务端接口,该接口需继承Remote类
public interface IHello extends Remote
{
public String sayHello() throws RemoteException;
}
2.服务端实现该接口的实现类,该类需继承UnicastRemoteObject类。
public class HelloImp extends UnicastRemoteObject implements IHello{
protected HelloImp() throws RemoteException {
}
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public String sayHello() {
return "hello";
}
}
3.服务端注册远程方法
public class Test {
public static void main(String[] args) throws RemoteException
{
IHello rhello = new HelloImp();
try
{
//本地注册到8888端口
LocateRegistry.createRegistry(8888);
try {
//将接口绑定到url
Naming.bind("rmi://localhost:8888/RHello",rhello);
System.out.println("绑定成功");
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (AlreadyBoundException e) {
e.printStackTrace();
}
}
catch (RemoteException e)
{
e.printStackTrace();
}
}
}
4.客户端调用该远程方法
public class HelloClient {
public static void main(String[] args)
{
try {
//根据url连接到RMI注册
IHello hello = (IHello) Naming.lookup("rmi://192.168.1.146:8888/RHello");
System.out.println(hello.sayHello());
} catch (Exception e) {
// TODO: handle exception
}
}
}
RMI优缺点:
优点:
1.传输效率高。RMI使用二进制消息进行客户端与服务器端的交互。
缺点:
1.RMI是基于Java的。因为RMI使用了Java的序列化机制,所以必须保证通过网络传输的对象类型必须保证在调用的两端是同一版本。
2.RMI很难通过防火墙。因为RMI可以使用任意端口来实现交互,这在防火墙来说是不允许的。