• 什么是RMI?

维基百科:一种用于实现远程过程调用应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。

  • 什么是序列化及反序列化

(1)序列化:把对象转换为字节序列的过程称为对象的序列化。

(2)反序列化:把字节序列恢复为对象的过程称为对象的反序列化。

对象序列化用途:

1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;

    2) 在网络上传送对象的字节序列。

  • RMI远程调用步骤:

1),客户对象调用客户端辅助对象(stub对象)上的方法;

2),客户端辅助对象打包调用信息(变量,方法名),通过网络发送给服务端辅助对象(skeleton对象);

3),服务端辅助对象将客户端辅助对象发送来的信息解包,找出真正被调用的方法以及该方法所在对象;

4),调用真正服务对象上的真正方法,并将结果返回给服务端辅助对象;

5),服务端辅助对象将结果打包,网络发送给客户端辅助对象;

6),客户端辅助对象将返回值解包,返回给客户对象;

7),客户对象获得返回值;

  • RMI实例:

 共同部分,包含Person.java,ImyRemote.java;

import java.io.Serializable;
public class Person implements Serializable {
/**
* 序列化ID
*/
private static final long serialVersionUID = -3245478690496182643L;
public String name;
public int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}

  

import java.rmi.Remote;
import java.rmi.RemoteException;
public interface IMyRemote extends Remote {
String sayHello() throws RemoteException;
Person getPerson() throws RemoteException;
}

  Server部分,包含MyRemoteImpl.java,Server.java:

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject; public class MyRemoteImpl extends UnicastRemoteObject implements IMyRemote {
public MyRemoteImpl() throws RemoteException {
}
@Override
public String sayHello() {
return "server say,hello world";
} @Override
public Person getPerson() throws RemoteException {
return new Person("张三",18);
}
}

  

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException; public class Server {
public static void main(String[] args) {
try{
// LocateRegistry.createRegistry(1099);
IMyRemote iRemote = new MyRemoteImpl();
Naming.rebind("rmi://198.181.47.219:1099/remoteServer", iRemote);
System.out.println("绑定成功");
}catch (RemoteException e){
System.out.println("RemoteException");
e.printStackTrace();
} catch (MalformedURLException e) {
System.out.println("MalformedURLException");
e.printStackTrace();
}
}
}

  Client部分,包含Client.Java:

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException; public class Client {
public static void main(String[] args) throws RemoteException, NotBoundException, MalformedURLException {
IMyRemote client = (IMyRemote) Naming.lookup("rmi://198.181.47.219:1099/remoteServer");
System.out.println(client.sayHello());
Person p = client.getPerson();
System.out.println("name:" + p.getName() + "age:" + p.getAge());
}
}

  注:

(1) 启动远程服务前,需要先启动rmiregistry(Naming.rebind注册服务,rmiregistry必须运行);

(2)传输的对象的类型必须成为可序列化类型(编译器无法发现);

java 远程方法调用(RMI)的更多相关文章

  1. Java远程方法调用(Remote Method Invocation,RMI)

    Java RMI简介: 它是Java的一个核心API和类库,允许一个Java虚拟机上运行的Java程序调用不同虚拟机上运行的对象中的方法,即使这两个虚拟机运行于物理隔离的不同主机上. Java RMI ...

  2. Java中间件之RMI及实例介绍 · zijian's blog

    RMI介绍   远程方法调用(Remote Method Invocation)是Sun公司规定的允许在不同的JAVA虚拟机之间进行对象间通信的一种规范.在RMI中,JVM可以位于一个或多个计算机上, ...

  3. Java安全之RMI反序列化

    Java安全之RMI反序列化 0x00 前言 在分析Fastjson漏洞前,需要了解RMI机制和JNDI注入等知识点,所以本篇文来分析一下RMI机制. 在Java里面简单来说使用Java调用远程Jav ...

  4. Java安全之RMI协议分析

    Java安全之RMI协议分析 0x00 前言 在前面其实有讲到过RMI,但是只是简单描述了一下RMI反序列化漏洞的利用.但是RMI底层的实现以及原理等方面并没有去涉及到,以及RMI的各种攻击方式.在其 ...

  5. Java开发中RMI和webservice区别和应用领域

    Java开发中RMI和webservice区别和应用领域 一.RMI和webservice区别和联系 0. 首先,都是远程调用技术. 1. RMI是在TCP协议上传递可序列化的java对象(使用Str ...

  6. Java远程方法调用(RMI)

    Java RMI 指的是远程方法调用 (Remote Method Invocation).它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法.可以用此方 ...

  7. Java学习---面向对象的远程方法调用[RMI]

    基础知识 分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果. 常见的分 ...

  8. java 对象序列化 RMI

    对于一个存在于Java虚拟机中的对象来说,其内部的状态只保持在内存中.JVM停止之后,这些状态就丢失了.在很多情况下,对象的内部状态是需要被持久化下来的.提到持久化,最直接的做法是保存到文件系统或是数 ...

  9. JAVA 中的RMI是什么

    RMI的概念 RMI(Remote Method Invocation)远程方法调用是一种计算机之间利用远程对象互相调用实现双方通讯的一种通讯机制.使用这种机制,某一台计算机上的对象可以调用另外 一台 ...

随机推荐

  1. Codeforces Round #481 (Div. 3) C. Letters

    题目地址:http://codeforces.com/contest/978/problem/C 题解:有n个宿舍,每个宿舍人不一样多,有m封信,每封信送给对应的第m间房间,问这封信是给第几个宿舍,第 ...

  2. WPF 字体图标样式

    1.在网上下载Font ICO 字体字体压缩包 Font Awesome 矢量图标库    2.下载到的压缩包,解压后获得图标字体文件        3.然后把字体文件夹拷贝到项目中,目录为(/fon ...

  3. CSS3 03. 3D变换、坐标系、透视perspective、transformZ、transform-style添加3D效果、backface-visibility元素背面可见、动画animation、@keyfarmes、多列布局

    1.左手坐标系 伸出左手,让拇指和食指成“L”形,大拇指向右,食指向上,中指指向前方.这样我们就建立了一个左手坐标系,拇指.食指和中指分别代表X.Y.Z轴的正方向.如下图 CSS中的3D坐标系 CSS ...

  4. Linux执行后台work相关

    Linux的后台运行.关闭.查看后台任务 & ctrl+z jobs fg bg kill nohup setsid disown screen 1.& 加在命令的最后,可以把命令放到 ...

  5. jumper-server-第一次粗略配置

    https://www.cnblogs.com/zsl-find/articles/11179450.html

  6. ASP.NET Core SignalR:集线器Hubs

    一.什么是集线器hubs 通过SignalR的集线器hubs中定义的方法,服务器可以调用连接中的客户端定义的方法,而客户端也可以调用服务器端集线器中定义的方法.SignalR负责实现了客户端和服务器之 ...

  7. 正确应用Java数组

    一.数组的特点 数组与其他容器的区别有三方面:效率.类型和保存基本类型的能力. 1.效率.数组是一种效率最高的存储和随机访问对象引用序列的方式.数组是一段连续地址空间内的线性序列,所以访问非常快.但也 ...

  8. IO、IO序列化

    文件:文件可认为是相关记录或放在一起的数据的集合.文件一般保存在硬盘.U盘.光盘.云盘的媒介中. JAVA API:java.io.File类可操作文件 File对象的构建 File file=new ...

  9. java获取电脑mac物理地址

    import java.net.InetAddress;import java.net.NetworkInterface;import java.net.SocketException;import ...

  10. 单点登录(Single Sign On)解决方案

    单点登录(Single Sign On)解决方案 需求 多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. A 网站和 B 网站是同一家公司的关联服务.现在要求,用户只要在其中一个网 ...