RMI入门实例

看到RMI,首先想到了这个问题,什么是RMI

Java RMI (Remote Method Invocation 远程方法调用)是用Java在JDK1.1中实现的,它大大增强了Java开发分布式应用的能力。Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上,而RMI就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本。但是传统RPC并不能很好地应用于分布式对象系统。而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。(从网上copy的,呵呵)

它与WEBSERVICE有什么区别。

rmi的客户端和服务端都必须是java,webservice没有这个限制

webservice是在http协议上传递xml文本文件,与语言和平台无关

rmi是在tcp协议上传递可序列化的java对象,只能用在java虚拟机上,绑定语言

RMI是EJB远程调用的基础,仅用RMI技术就可以实现远程调用,使用EJB是为了实现组件,事物,资源池,集群等功能。

WebService是通过XML来传输数据,可用http等协议因此可在异构系统间传递,并且可以穿过防火墙,可在公网上远程调用。

一张图解释远程方法调用的过程。RMI将客户辅助对象称为stub,服务辅助对象成为skeleton。
[img]http://dl2.iteye.com/upload/attachment/0096/8439/4da9d1fb-0845-3295-b82f-63de250ee095.jpg[/img]

下面是一个RMI的入门实例。

目录结构:

[img]http://dl2.iteye.com/upload/attachment/0096/8434/16649ab1-34be-3004-b8d8-7e945e93aeeb.jpg[/img]
1. 被调用的远程对象必须实现java.rmi.Remote接口,该接口是一个空接口,只是用来标志实现它的对象可以被远程访问。开发中一般根据业务需要自己创建接口来继承该接口,并封装可以被远程调用的方法。

package edu.rob.rmi.remote;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface MyRemote extends Remote {
public String getHello() throws RemoteException;
}

远程调用依赖网络与IO,因此接口中的方法必须抛出RemoteException,否则会报错误 - java.rmi.server.ExportException: remote object implements illegal remote interface

2. 然后创建该接口的实现类,一般继承自UnicastRemoteObject:

package edu.rob.rmi.remote;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;


public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote {

private static final long serialVersionUID = 1579125597612791522L;

public MyRemoteImpl() throws RemoteException {}

@Override
public String getHello() {
System.out.println("Sever: hello");
return "hello";
}

}

3. 在server端的rmi registry中注册该服务。在client访问远程方法之前,必须完成server端的绑定。

package edu.rob.rmi.server;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;

import edu.rob.rmi.remote.MyRemoteImpl;
import edu.rob.rmi.remote.MyRemote;

public class HelloRMIServer {

public static void main(String[] args) {

try {
MyRemote h = new MyRemoteImpl();
LocateRegistry.createRegistry(1099);
Naming.rebind("rmi://192.168.1.101:1099/hello", h);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}

4. 编写client访问远程方法。需要注意的是,client同样需要一份远程方法的接口。直接将server端的接口拷贝至客户端就可以(注意包名、类名必须相同)。

package edu.rob.rmi.client;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

import edu.rob.rmi.remote.MyRemote;

public class HelloRMIClient {

public static void main(String[] args) {
try {
MyRemote h = (MyRemote) Naming.lookup("rmi://192.168.1.101:1099/hello");
System.out.println("Client: " + h.getHello());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
} catch (NotBoundException e) {
e.printStackTrace();
}
}
}

先运行HelloRMIServer,再运行HelloRMIClient,我们能再控制台看到如下输出
[code]
Sever: hello
Client: hello
[/code]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值