RMI(remote method invoke)是Java实现透明远程调用的机制,客户端仅持有服务端的接口。RMI应用的两种写法:
1、利用UnicastRemoteObject.exportObject()
server端:
public interface Business extends Remote {
public void call(String str) throws RemoteException;
}
public class BusinessImpl implements Business{//服务类实现Remote接口
public void call(String str) throws RemoteException{
System.out.println("client send:"+str);
}
}
public class Server {
public static void main(String[] args) throws Exception{
String name="business";
Business bus=new BusinessImpl();
Registry reg=LocateRegistry.createRegistry(1099);//在rmi默认端口创建rmi注册表
reg.bind(name, bus);//将remote对象绑定到rmi注册表
UnicastRemoteObject.exportObject(bus);//将remote对象暴露到匿名端口
}
}
client端:
public class Client {
public static void main(String[] args) throws Exception{
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
Registry reg=LocateRegistry.getRegistry("192.168.1.110",1099);//获得指定主机的rmi注册表引用
String name="business";
Business bus=(Business)reg.lookup(name);//查找remote对象
String line;
while(!"bye".equals(line=in.readLine())){
bus.call(line);
}
in.close();
}
}
2、Remote对象继承UnicastRemoteObject
第一种方式不需要生成服务器端remote对象存根(stub),但编码有些多。还可以通过继承UnicastRemoteObject的方式,利用Naming.bind()简化代码,但这种方式需要rmic生成remote实现类的存根。
//Business接口不变
...
//remote实现类继承UnicastRemoteObject
public class BusinessImpl extends UnicastRemoteObject implements Business{
public void call(String str) throws RemoteException{
System.out.println("client send:"+str);
}
}
服务端:
public class Server {
public static void main(String[] args) throws Exception{
String name="rmi://192.168.1.110:1099/business";
Business bus=new BusinessImpl();
Naming.bind(name, bus);
}
}
客户端:
public class Client {
public static void main(String[] args) throws Exception{
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
String name="rmi://192.168.1.110:1099/business";
Business bus=(Business)Naming.lookup(name);
String line;
while(!"bye".equals(line=in.readLine())){
bus.call(line);
}
in.close();
}
}
然后的步骤:
1)生成remote实现类的存根
rmic xx.xx.BusinessImpl
2)启动rmi注册表
windows下:start rmiregistry
linux下:rmiregistry
3)启动服务端
java xx.xx.Server
4)启动客户端请求
java xx.xx.Client
第2种方式其实更加不方便(需要手动生成存根、启动rmiregistry)
下一篇介绍利用Spring更方便的将普通的Service暴露为Remote服务。
分享到:
相关推荐
java rmi java rmijava rmi javajava rmi java rmi rmi
java RMI技术实现的网络聊天室 编译通过,很完整的。代码很有参考价值
采用JAVA rmi,带图形界面,完全由自己实现的聊天室,具备基本的聊天功能,可以自己扩充功能
检测javaRMI反序列化漏洞
java RMI
Java RMI 完整版 Java Remote Method Invocation(RMI)是一种分布式对象技术,允许使用 Java 编写分布式对象,不同的 Java 虚拟机(JVM)之间进行对象间的通讯。这使得应用程序(Application)可以远程调用方法,...
java RMI实现代码。分为客户端和服务器端,有清楚的代码注释。
Java RMI 简单示例
最近在学习代理模式,用到了java rmi远程调用,包含服务端和客户端,之前一直没有接触过,学习了java rmi远程调用,一方面可以了解代理模式,一方面熟悉java低层的远程
JavaRMI.pdf
《Java RMI》一书的英文版本,With Java RMI, you'll learn tips and tricks for making your RMI code excel. This book provides strategies for working with serialization, threading, the RMI registry, ...
这是本人搜集整理的Java RMI规范,中文版,经过排版 共包括10个章节,2个附录
在这次的项目中,对于客户端与服务器之间的通信,想了许多办法,由于做的是富客户端应用,最终将技术选定在了RMI和Java-sockets两种之间,其中RMI的灵活性不高,客户端和服务器端都必须是java编写,但使用比较方便,...
这是原创的最简单的Java RMI入门项目,内含二个Eclipse项目,一是服务器端,二是客户端。非常简单,只看其中的注释就能理解(当然先要知道什么是RMI了),只供入门用。 这是用Java 1.7编辑的,如果你用的版本低,则...
JavaRMI的原理和实现方法 分布式对象计算 来源于青岛大学学报
实验名称 基于Socket的C/S编程实验 实验名称 基于Java RMI的C/S编程实验
java rmi 调用实例及详细说明,详细可参见博客:http://blog.csdn.net/fufengrui/article/details/9855865
JAVARMI实例[文].pdf
网络上绝大多数关于Java RMI分布式编程的资料真的很久、很古老了, 我也是偶尔看到别人的文章,自己动手做实验才总结的一些心得与例子, 希望能够帮到那些有用的人!