1、定义一个表示远程服务的接口RemoteInterface,必须继承自java.rmi.Remote(Remote是一个标识,没有抽象的方法)。
在RemoteInterface里定义可被远程调用的方法,方法必须声明抛出java.rmi.RemoteException。
public interface RemoteInterface extends Remote {
public long serverTime() throws RemoteException;
}
2、定义一个类RemoteClass继承自UnicastRemoteObject类,且实现了远程服务接口RemoteInterface,
public class RemoteClass extends UnicastRemoteObject implements RemoteInterface {
private static final long serialVersionUID = 1L;
protected RemoteClass() throws RemoteException {
super();
}
@Override
public long serverTime() throws RemoteException {
return System.currentTimeMillis();
}
public static void main(String[] args) {
try {
RemoteClass rc = new RemoteClass();
// 创建一个远程对象注册表,并绑定到端口8985;
// 如果要绑定IP,则使用createRegistry(int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf),通过
// 在RMIClientSocketFactory、RMIServerSocketFactory的定制实现里绑定IP。
Registry registry = LocateRegistry.createRegistry(8985);
// 在rmi远程对象注册表注册一个远程对象。
registry.bind("serverTime", rc);
} catch (RemoteException e) {
e.printStackTrace();
} catch (AlreadyBoundException e) {
e.printStackTrace();
}
}
}
3、客户端查找远程对象的示例
public class ClientClass {
public static void main(String[] args) {
// 通过远程注册表查找远程对象
try {
// 获取远程注册表
Registry remoteRegistry = LocateRegistry.getRegistry("127.0.0.1", 8985);
// 从远程注册表获取远程对象
RemoteInterface remoteTime = (RemoteInterface)remoteRegistry.lookup("serverTime");
for(int i = 0; i < 10; i++) {
System.out.println("remote time :" + remoteTime.serverTime());
}
} catch (RemoteException e) {
e.printStackTrace();
} catch (NotBoundException e) {
e.printStackTrace();
}
// 通过远程注册表查找远程对象 end
System.out.println("================================================");
// 通过rmi协议查找远程对象
try {
// 查找远程对象
RemoteInterface remoteTime = (RemoteInterface)Naming.lookup("rmi://127.0.0.1:8985/serverTime");
for(int i = 0; i < 10; i++) {
System.out.println("remote time :" + remoteTime.serverTime());
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
} catch (NotBoundException e) {
e.printStackTrace();
}
}
}
4、编译这些类,用rmic编译器生成根:
rmic RemoteClass
在对应的包下会出现一个文件:RemoteClass_Stub.class
5、先后运行 RemoteClass ,ClientClass ,结果大致如下:
remote time :1303288008309
remote time :1303288008309
remote time :1303288008309
remote time :1303288008309
remote time :1303288008309
remote time :1303288008309
remote time :1303288008309
remote time :1303288008309
remote time :1303288008309
remote time :1303288008309
================================================
remote time :1303288008325
remote time :1303288008325
remote time :1303288008325
remote time :1303288008325
remote time :1303288008325
remote time :1303288008325
remote time :1303288008325
remote time :1303288008325
remote time :1303288008325
remote time :1303288008325
执行远程方法调用成功。
网上找到的绑定IP的其他方法,未验证:
System.setProperty("java.rmi.server.hostname", ip);
Naming.rebind("rmi://"+serverPath + ":" + port + "/" + serverName,
serverInterface);
分享到:
相关推荐
RMI简单实例RMI简单实例RMI简单实例
rmi简单例子,service实例和clent实例
最简单 最有效而且是最易懂的rmi理解例子
spring RMI 简单例子
Java RMI简单实例~~~~~~~~~~~
Java的远程方法(RMI)例子,有兴趣 ,可以下载学学!EJB底层用的就是Java的RMI
RMI的简单例子,简单方便,通俗易懂,一看就会,测试通过
远程服务的接口定义 远程服务接口的具体实现 桩(Stub)和框架... 一个RMI命名服务,它允许客户端去发现这个远程服务 类文件的提供者(一个HTTP或者FTP服务器) 一个需要这个远程服务的客户端程序
学习rmi的一个简单例子 参考于java2核心技术,卷2
java简单示例rmi java简单示例rmi
spring 与rmi 的整合 1.首先编写接口 interface : 这里的接口要继承Remote, 它是一个标识接口 2.编写实现类 3.编写main方法用于启动 service 4 配置spring文件 编写客户端测试类
创建客户端RMI调用服务端的应用程序。 启动服务端,再启动客户端,测试是否调用成功。 如果客户端和服务端不在同一台电脑上,则需要对刚才定义的服务类采用rmic 编译一个客户端的框架类_stub并拷贝到客户端的类...
java rmi 完整的简单例子 包含详细的文档说明
rmi 简单例子 rmi 简单例子
现在虽然我们很少用到RMI进行编程,但是做为Java一个最早的分布式解决方案,我们还是有了解的必要,从例子开始吧!
RMI最简单的一个实例RMI最简单的一个实例RMI最简单的一个实例
一个简单的不用Tomcat启动的RMI实例
一个简单的RMI例子Java源代码,用于学习理解RMI
RMI简单示例,主要用在一次对刚毕业的学生的培训中的。例子内容是完整的,非常简单,一个RMI开发的简单示例