- 浏览: 258631 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (88)
- JAVA / base (26)
- JAVA / web (12)
- JAVA / Lib-tools (5)
- SERVER / tomcat (4)
- DB / mysql (4)
- DB / mongodb (2)
- DB / memcached (2)
- DB / redis (2)
- WEB / Front-end (3)
- WEB / security (4)
- WEB / css (2)
- WEB / js (4)
- OS / linux (3)
- IT / Architecture (4)
- IT / other (2)
- Android (9)
- Go (1)
- Other (1)
- OS / Mac (2)
最新评论
-
Zero2Max:
哈哈,马士兵老师也发现了。
java实现接口的bug -
xly1981:
能像CSRF攻击一样带个图就更棒了
XSS跨站攻击 -
xmong:
df274119386 写道在javascript中看到下面的 ...
CSRF攻击与防御策略 -
df274119386:
在javascript中看到下面的语句 e.value = t ...
CSRF攻击与防御策略 -
xmong:
yzxqml 写道xmong 写道yzxqml 写道tomca ...
Tomcat集群
Java Rmi
目录
1 JAVA RMI 1
1.1 RMI简介 1
2 JAVA RMI的实现 1
2.1 JAVA RMI简单实现 1
1 Java RMI
1.1 RMI简介
Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。
RMI的工作原理:正常情况下,在同一个Java虚拟机中一个对象调用另一个对象的方法,要向该方法传递对象参数,以及获取方法返回值对象,这些都可以通过引用(指向Java虚拟机内存中的对象)来完成,这称为传引用。但是RMI远程调用方法是在不同虚拟机中来完成方法调用,这种传值方法就不适用了。因为不同Java虚拟机中同一个引用值指向的对象是不一样的,同时也可能不同的虚拟机引用的实现方式完全不同和不兼容。
因此为了实现向远程方法传递参数和获取远程方法返回结果,可以使用三种机制来实现,这取决于所传递的数据类型:
简单数据类型(int,Boolean,double等)是按值传递来完成的,这和本地java方法调用的值传递一样。
远程对象的引用(即实现了Remote接口的对象)是以远程引用(Remote Reference)传递来完成的,即允许接收方调用远程对象上的方法。这与本地java方法调用传递对象引用有些相似。
没有实现Remote接口的对象是按值来传递的,即通过对象序列化来传递整个对象的副本。
Java Rmi的通信机制就是根据上面传递机制来实现的。
2 JAVA RMI的实现
要实现RMI远程对象调用需要大部分类都在java.rmi,java.rmi.server和java.rmi.registry包中。
Java.rmi包定义了客户端所见的类,接口和异常。
Java.rmi.server包定义了服务器端可见的类,接口和异常。
Java.rmi.registry包定义了用于查找和命名远程对象的类,接口和异常。
2.1 Java RMI简单实现
HelloRmi:rmi服务接口
HelloRmiImpl:rmi服务实现类
Server:RMI服务器端类
Client:RMI客户端类
HelloRmi实现如下:
HelloRmiImpl实现如下:
Server实现如下:
Client实现如下:
执行结果如下:
运行Server
Server输出:
运行Client
Client输出:
Server输出:
目录
1 JAVA RMI 1
1.1 RMI简介 1
2 JAVA RMI的实现 1
2.1 JAVA RMI简单实现 1
1 Java RMI
1.1 RMI简介
Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。
RMI的工作原理:正常情况下,在同一个Java虚拟机中一个对象调用另一个对象的方法,要向该方法传递对象参数,以及获取方法返回值对象,这些都可以通过引用(指向Java虚拟机内存中的对象)来完成,这称为传引用。但是RMI远程调用方法是在不同虚拟机中来完成方法调用,这种传值方法就不适用了。因为不同Java虚拟机中同一个引用值指向的对象是不一样的,同时也可能不同的虚拟机引用的实现方式完全不同和不兼容。
因此为了实现向远程方法传递参数和获取远程方法返回结果,可以使用三种机制来实现,这取决于所传递的数据类型:
简单数据类型(int,Boolean,double等)是按值传递来完成的,这和本地java方法调用的值传递一样。
远程对象的引用(即实现了Remote接口的对象)是以远程引用(Remote Reference)传递来完成的,即允许接收方调用远程对象上的方法。这与本地java方法调用传递对象引用有些相似。
没有实现Remote接口的对象是按值来传递的,即通过对象序列化来传递整个对象的副本。
Java Rmi的通信机制就是根据上面传递机制来实现的。
2 JAVA RMI的实现
要实现RMI远程对象调用需要大部分类都在java.rmi,java.rmi.server和java.rmi.registry包中。
Java.rmi包定义了客户端所见的类,接口和异常。
Java.rmi.server包定义了服务器端可见的类,接口和异常。
Java.rmi.registry包定义了用于查找和命名远程对象的类,接口和异常。
2.1 Java RMI简单实现
HelloRmi:rmi服务接口
HelloRmiImpl:rmi服务实现类
Server:RMI服务器端类
Client:RMI客户端类
HelloRmi实现如下:
package com.rmi; import java.rmi.Remote; import java.rmi.RemoteException; /** * 定义一个rmi服务接口,rmi接口必须继承Remote接口, * 其中需要远程调用的方法必须抛出RemoteException异常 * @author xmong */ public interface HelloRmi extends Remote{ /** * 简单实现的say hi方法 * @param name * @return * @throws RemoteException */ public String sayHi(String name) throws RemoteException; }
HelloRmiImpl实现如下:
package com.rmi; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; /** * rmi接口实现,rmi实现继承了UnicastRemoteObject类, * UnicastRemoteObject类提供了很多支持远程调用的方法。 * @author xmong */ public class HelloRmiImpl extends UnicastRemoteObject implements HelloRmi{ /** * 序列化对象 */ private static final long serialVersionUID = 1L; /** * 因为UnicastRemoteObject的构造方法抛出了RemoteException异常, * 因此这里默认的构造方法必须写,必须声明抛出RemoteException异常 * @throws RemoteException */ protected HelloRmiImpl() throws RemoteException { super(); } /** * 传入一个客户端名称字符串,对该名称问候,输出客户端名称和 ip * 返回客户端名称“Server” */ @Override public String sayHi(String name) throws RemoteException{ try { //UnicastRemoteObject的getClientHost()获取客户端主机名 System.out.println("Server: Hi "+name+" "+getClientHost()); } catch (ServerNotActiveException e) { e.printStackTrace(); } return "Server"; } }
Server实现如下:
package com.rmi; import java.net.MalformedURLException; import java.rmi.AlreadyBoundException; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; /** * 创建RMI注册表,启动RMI服务,并将远程对象注册到RMI注册表中。 * @author xmong */ public class Server { public static void main(String[] args) { try { //创建远程服务对象 HelloRmi hr = new HelloRmiImpl(); /** * 在本机上注册远程服务端口9999,这一步必不可少, * 缺少注册表创建,则无法绑定远程服务对象到远程注册表上 ,启动时会抛出Connection refused异常。 * java默认端口为1099,可以通过Registry.REGISTRY_PORT来获取这个值 */ LocateRegistry.createRegistry(9999); /** * 把远程服务对象注册到服务器上命名为:hello * /绑定的URL标准格式为:rmi://host:port/name * 其中协议名可以省略,即[rmi:]可以省去 */ Naming.bind("rmi://localhost:9999/hello", hr); System.out.println("Rmi Server bind success"); } catch (RemoteException e) { System.out.println("创建远程服务对象异常!"); e.printStackTrace(); } catch (MalformedURLException e) { System.out.println("绑定远程URL发生异常!"); e.printStackTrace(); } catch (AlreadyBoundException e) { System.out.println("发生重复绑定异常!"); e.printStackTrace(); } } }
Client实现如下:
package com.rmi; import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.RemoteException; /** * 客户端测试,客户端远程访问服务对象方法。 * @author xmong */ public class Client { public static void main(String[] args) { try { /** * 在RMI服务注册表中查找名称为RHello的对象,并调用其上的方法 */ HelloRmi hr = (HelloRmi)Naming.lookup("rmi://localhost:9999/hello"); //调用服务方法 System.out.println("Client: Hi "+hr.sayHi("Client")); } catch (MalformedURLException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } catch (NotBoundException e) { e.printStackTrace(); } } }
执行结果如下:
运行Server
Server输出:
Rmi Server bind success
运行Client
Client输出:
Client: Hi Server
Server输出:
Server: Hi Client 172.30.39.227
发表评论
-
Java validation(java验证器实现)
2014-03-18 11:45 3628Java validation 1. java验证器 在 ... -
Memo class备注类信息
2014-03-18 09:52 806Memo Class 1. 什么是Memo Class Mem ... -
java annotation注解
2014-01-24 18:01 9041. Annotation的声明方式 An ... -
java内部类
2013-03-19 16:25 993Java内部类 目录 1 JAVA ... -
java多线程设计模式之订单模式
2013-03-11 14:00 2605Java多线程实现订单模式: 客户端线程向服务端发起请求后, ... -
java多线程设计模式之线程池处理请求
2013-03-08 17:50 1781Java实现线程池处理请求: 客户端线程发出请求,请求存入请 ... -
java多线程设计模式之异步处理请求
2013-03-08 12:36 4481Java实现多线程异步处理请求: Java实现多线程异步处理 ... -
java多线程设计模式之读写文件模式
2013-03-07 17:56 1542Java实现多线程读写数据 ... -
java多线程设计模式之生产者与消费者
2013-03-07 11:34 996Java实现多线程生产者与消费者: 生产者线程负责生产产品 ... -
java多线程设计模式之文件保存
2013-03-06 16:16 1546Java实现多线程保存文件:两线程去保存文件,一个保存线程定时 ... -
java多线程设计模式之队列通信
2013-03-06 13:51 2431Java实现多线程处理队列请求通信:客户端线程向请求队列中不断 ... -
Java读linux系统文件文件名乱码
2012-12-06 17:01 90561,问题描述 web应用想通过Java读取linux系统文件显 ... -
Java安全加密
2012-11-28 10:24 1915安全加密 目录 1 加密安全 1 1.1 应用的安全 1 ... -
图着色问题
2012-11-27 13:05 3059图着色问题 目录 1 图 ... -
JDK6新特性
2012-07-03 23:24 2859JDK6的新特性 JDK6的新特性之一_Desktop类 ... -
JDK7新特性
2012-07-03 15:39 3468JDK7新特性 一 JDK7新特性简介 准备 JDK7下载 ... -
JDK5新特性
2012-07-03 10:23 73JDK5.0新特性 1.自动封箱和自动解封(简单类型和封装类 ... -
java多线程
2012-06-15 15:12 1509Java多线程 目录 1 线 ... -
代理模式
2012-06-13 14:12 1310代理模式 目录 1 代理 ... -
java垃圾回收机制
2012-06-11 11:30 2526Java内存回收 目录 1 JAVA内存STACK和HE ...
相关推荐
java rmi java rmijava rmi javajava rmi java rmi rmi
java RMI技术实现的网络聊天室 编译通过,很完整的。代码很有参考价值
采用JAVA rmi,带图形界面,完全由自己实现的聊天室,具备基本的聊天功能,可以自己扩充功能
检测javaRMI反序列化漏洞
java RMI
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, ...
javaRMI完整版.pdf
这是本人搜集整理的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分布式编程的资料真的很久、很古老了, 我也是偶尔看到别人的文章,自己动手做实验才总结的一些心得与例子, 希望能够帮到那些有用的人!