Java RMI远程方法调用

时间:2022-09-05 12:41:09

RMI(远程接口调用)
1. RMI的原理:

RMI系统结构,在客户端和服务器端都有几层结构。

方法调用从客户对象经占位程序(Stub)、远程引用层(Remote Reference Layer)和传输层(Transport
Layer)向下,传递给主机,然后再次经传 输层,向上穿过远程调用层和骨干网(Skeleton),到达服务器对象。
占位程序扮演着远程服务器对象的代理的角色,使该对象可被客户激活。
远程引用层处理语义、管理单一或多重对象的通信,决定调用是应发往一个服务器还是多个。传输层管理实际的连接,并且追追踪可以接受方法调用的远程对象。服
务器端的骨干网完成对服务器对象实际的方法调用,并获取返回值。返回值向下经远程引用层、服务器端的传输层传递回客户端,再向上经传输层和远程调用层返
回。最后,占位程序获得返回值。

2. RMI(远程方法调用)的组成

一个正常工作的RMI系统由下面几个部分组成:

•远程服务的接口定义

  •远程服务接口的具体实现

  •桩(Stub)和框架(Skeleton)文件

  •一个运行远程服务的服务器

  •一个RMI命名服务,它允许客户端去发现这个远程服务

  •类文件的提供者(一个HTTP或者FTP服务器)

  •一个需要这个远程服务的客户端程序

3. RMI的实现

3.1 服务器端的实现

(1)编写一个远程接口:

package com.gjy.rmi.service;

import java.rmi.Remote;
import java.rmi.RemoteException; public interface AddServer extends Remote {
public int AddNumbers(int firstnumber,int secondnumber) throws RemoteException;
}

(2) 编写远程接口的实现

package com.gjy.rmi.service;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject; public class AddServerImpl extends UnicastRemoteObject implements AddServer {
public AddServerImpl() throws RemoteException {
super();
}
public int AddNumbers(int firstnumber,int secondnumber) throws RemoteException {
return firstnumber + secondnumber;
}
}

(3) 编写服务器端程序

package com.gjy.rmi.service;

import java.rmi.Naming;
import java.rmi.registry.LocateRegistry; public class RmiServer {
/**
* 启动 RMI 注册服务并进行对象注册
*/
public static void main(String[] argv)
{
try
{
//启动RMI注册服务,指定端口为1099 (1099为默认端口)
//也可以通过命令 $java_home/bin/rmiregistry 1099启动
//这里用这种方式避免了再打开一个DOS窗口
//而且用命令rmiregistry启动注册服务还必须事先用RMIC生成一个占位程序(stub类)为它所用
LocateRegistry.createRegistry(1099); //创建远程对象的一个或多个实例,下面是hello对象
//可以用不同名字注册不同的实例
AddServer add = new AddServerImpl(); //把hello注册到RMI注册服务器上,命名为Hello
Naming.rebind("Hello", add); //如果要把hello实例注册到另一台启动了RMI注册服务的机器上
//Naming.rebind("//192.168.1.105:1099/Hello",hello); System.out.println("Hello Server is ready.");
}
catch (Exception e)
{
System.out.println("Hello Server failed: " + e);
}
}
}

3.2 编写客户端程序

package com.gjy.rmi.client;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException; import com.gjy.rmi.service.AddServer; public class RmiClient {
public static void main(String args[]) throws RemoteException, MalformedURLException, NotBoundException {
String url="rmi://127.0.0.1/Hello";
AddServer add;
add = (AddServer)Naming.lookup(url);
int result=0;
for (int i =0;i<10;i++){
result = add.AddNumbers(10,i);
System.out.println(result);
}
}
}

Java RMI远程方法调用的更多相关文章

  1. Java RMI 远程方法调用

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

  2. RMI远程方法调用

    RMI远程方法调用:适用于 客户端 调用 服务器 内的方法:(Kotlin 语言编写) 如果业务为二个服务器之间的通信,还是得用消息队列的形式,因为RMI 不适合 双向 调用 下面介绍RMI 的使用方 ...

  3. 简单实现Java的RMI——远程方法调用

    一.RMI简介: 说到RMI就不得不说RPC了. RPC:(Remote Procedure Call),远程过程调用. RMI(Remote Method Invocation),远程方法调用. R ...

  4. Java APi 之 RMI远程方法调用

    一.什么是RPC RPC全称是remote procedure call,即远程过程调用.它是一种协议,用于从远程计算机上请求服务. 例如有两台服务器A和B,A上的应用想要调用B上应用的方法,但是他们 ...

  5. 【Java Web开发学习】远程方法调用RMI

    Java RMI 远程方法调用Remote Method Invocation 转载:http://www.cnblogs.com/yangchongxing/p/9078061.html 1.创建远 ...

  6. &lbrack;转&rsqb;Java远程方法调用

    Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口.它使客户机上运行的程序可以调用远 ...

  7. SpringBoot里使用RMI进行远程方法调用

    一.Java RMI定义 Java RMI:Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程 ...

  8. java rmi 使用方法

    server package Server; import java.rmi.Naming; import java.rmi.RMISecurityManager; import java.rmi.r ...

  9. RMI远端方法调用

    一.RMI介绍 RMI(Remote Method Invocation),RMI是分布式对象软件包,它简化了在多台计算机上的JAVA应用之间的通信.必须在jdk1.1以上,RMI用到的类:java. ...

随机推荐

  1. 初识Java

    Java是一种简单的.面向对象的.分布式的.解释的.安全的.可移植的.性能优异的多线程语言.它以极强的安全性.平台无关性.硬件结构无关性.语言简洁.面向对象的特点,在网络编程语言中占据了无可比拟的优势 ...

  2. 错误&Tab;1&Tab;error C4996&colon; &&num;39&semi;scanf&&num;39&semi;&colon; This function or variable may be unsafe&period; Consider using scanf&lowbar;s instead&period; To disable deprecation&comma; use &lowbar;CRT&lowbar;SECURE&lowbar;NO&lowbar;WARNINGS&period; See online help for details&period;&Tab;d&colon;&bsol;users&bsol;vs2013&bsol;le

    #define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>void main(){    int nu ...

  3. 8个必备的PHP功能开发 &lpar;转&rpar;

    做过PHP开发的程序员应该清楚,PHP中有很多内置的功能,掌握了它们,可以帮助你在做PHP开发时更加得心应手,本文将分享8个开发必备的PHP功能,个个都非常实用,希望各位PHP开发者能够掌握. 1.传 ...

  4. js和jQuery 获取屏幕高度、宽度

    js获取屏幕高度,宽带 网页可见区域宽:document.body.clientWidth网页可见区域高:document.body.clientHeight网页可见区域宽:document.body ...

  5. Python可视化:Seaborn库热力图使用进阶

    前言 在日常工作中,经常可以见到各种各种精美的热力图,热力图的应用非常广泛,下面一起来学习下Python的Seaborn库中热力图(heatmap)如何来进行使用. 本次运行的环境为: windows ...

  6. vim配置分享&lpar;持续更新中&rpar;

    作者:zhanhailiang 日期:2014-10-24 set nocompatible set nu   "" 自己主动缩进 syntax on set autoindent ...

  7. 自动化运维工具---expec

    作为运维经常操作Linux服务器是不可避免的事情的,那么你们都是怎么管理的呢? 我们管理的方式较为复杂了,我说一下: 有一套服务器资产管理系统,所有服务器都记录在上面,包括用户名密码,内外网地址都会有 ...

  8. &lbrack;Swift&rsqb;LeetCode994&period; 腐烂的橘子 &vert; Rotting Oranges

    In a given grid, each cell can have one of three values: the value 0 representing an empty cell; the ...

  9. cdcq的独立博客

    cdcq的独立博客终于又复活啦,以后就用这个了 地址: http://cdcq.coding.me 现在用的是luogu的博客:https://cdcq.blog.luogu.org/

  10. Spark Distributed matrix 分布式矩阵

    RowMatrix行矩阵 import org.apache.spark.rdd.RDD import org.apache.spark.mllib.linalg.Vectors import org ...