RMI(Remote Method Invocation ) 概念恢复

1、RMI是远程方法调用的简称,像其名称暗示的那样,它能够帮助我们查找并执行远程对象,通俗的说,远程调用就像一个class放在A机器上,然后在B机器中调用这个class的方法。

2、EMI术语

在研究代码之前,我们来看看必须编写哪些代码:

远程对象:这个接口只定义了一个方法,我们应当明白的是,这个接口可以既包含方法的代码也包含方法的定义。远程对象包含要导出的每个方法的定义,并且实现Java.RMI中的远程接口。

远程对象实现:这是一个实现远程对象的类。如果实现了远程对象,就能够覆盖该对象中的所有方法,因此,远程对象的实现类将真正包含我们希望=导出的方法代码。

远程服务器:这是一个作为服务器使用的类,它是相对要远程访问方法的客户端而言的。它储存着绑定的字符串和对象。

远程客户端:这是一个帮助我们访问远程方法提供帮助的类,它也是最终用户。

Stub(存根)和Skeleton(骨架)

Stub和Skeleton是经过RMIC命令生成的,我们的程序要通过远程调用,底层一定是套接字的字节传输,传输到服务器或者客户端的对端后,再把该对象反序列化为对应的对象,这些网络传输的过程要求安全、稳定等等非常麻烦的操作,Stub驻留客户端,承担着代理远程对象的实现者的角色,Skeleton类帮助远程对象与Stub在RMI连接上进行通信。RMI的客户与STUB进行交换,STUB与SKELETON通信,SKELETON负责与服务器进行交互,因此有了STUB和SKELETON之后我们就不要需要实现底层通信的细节,我们进行的远程调用,只需要通过接口对方法进行操作即可,使分布式调用实现了位置上的透明,即:远程调用就像本地调用一样。

服务器端实现

1.服务接口

/**
*服务接口
*定义了行为集
*/
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface IHello extends Remote {

      /**
      * 在服务器打印客户端发过来的message 并返回“Hello World”字符串
      */
      public String sayHello(String message) throws RemoteException;
}

2.服务实现

/**
*服务实现
*继承UnicastRemoteObject
*/
import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;
public class HelloImpl  extends UnicastRemoteObject implements IHello {

     //必须的
     public HelloImpl() throws RemoteException {
         super();
     }

     @Override
     public String sayHello(String message) {
          System.out.println("================client message" + message);
          return "Hello World!";
     }

} 

3.启动RMI服务器并暴露服务

/**
*RMI服务器
*1、创建一个服务
*2、启动服务器
*3、注册服务
*/
import java.rmi.registry.*;
import java.rmi.*;
import java.rmi.server.*;

public class HelloServer {

    public static void main(String[] args) throws Exception {

        //1
        IHello hello = new HelloImpl();

        //2启动服务器 启动一个注册表并把注册表绑定到一个端口(默认端口1099)
        LocateRegistry.createRegistry(8888);
        //3将服务注册到注册表  绑定的URL标准格式为:rmi://host:port/name(其中协议名可以省略,下面两种写法都是正确的)
        Naming.bind("rmi://localhost:8888/hello", hello);

        System.out.println("========服务器启动了");

    }

}

客户端实现
1.服务接口

/**
*服务接口
*定义了行为集
*/
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface IHello extends Remote {

      /**
      * 在服务器打印客户端发过来的message 并返回“Hello World”字符串
      */
      public String sayHello(String message) throws RemoteException;
}

2.客户端实现

/**
* 1、服务实现者是谁? 服务器
* 2、如何获取服务 查找
* 3、如何调用服务接口
*/
import java.rmi.*;
public class HelloClient {

     public static void main(String[] args) throws Exception {

        //1、查找服务
        IHello hello = (IHello)Naming.lookup("rmi://localhost:8888/hello");

        System.out.println(Naming.lookup("rmi://localhost:8888/hello"));
        //2、调用
        System.out.println(hello.sayHello("haha"));

     }
}
时间: 2024-10-12 20:13:20

RMI(Remote Method Invocation ) 概念恢复的相关文章

Spring Remoting: Remote Method Invocation (RMI)--转

原文地址:http://www.studytrails.com/frameworks/spring/spring-remoting-rmi.jsp Concept Overview Spring provides four ways to develop remote services. Remote services are services hosted on remote servers and accessed by clients over the network. For examp

DMI(Dynamic Method Invocation) 动态方法调用

创建action,内容如下: package action; import com.opensymphony.xwork2.ActionSupport; public class A extends ActionSupport { public String toJsp(){ return "success"; } } 配置struts.xml,内容如下: <?xml version="1.0" encoding="UTF-8" ?>

javac之Method Invocation Expressions

15.12.1. Compile-Time Step 1: Determine Class or Interface to Search 15.12.2. Compile-Time Step 2: Determine Method Signature 15.12.2.1. Identify Potentially Applicable Methods 15.12.2.2. Phase 1: Identify Matching Arity Methods Applicable by Subtypi

java7新特性之Simplified varargs method invocation

java7新特性之Simplified varargs method invocation This is one of the simplest changes of all-it moves a warning about type information for a very specific case where varargs combines with generics in a method signature. Put another way, unless you're in

JAVA struts2 获取 Action或Method invocation proxy

ActionInvocation invocation = ActionContext.getContext().getActionInvocation(); Object action = invocation.getAction(); Method method = action.getClass().getMethod(invocation.getProxy().getMethod());

A javascript library providing cross-browser, cross-site messaging/method invocation. http://easyxdm.net

easyXDM - easy Cross-Domain Messaging easyXDM is a Javascript library that enables you as a developer to easily work around the limitation set in place by the Same Origin Policy, in turn making it easy to communicate and expose javascript API's acros

Dameware?Mini?Remote?Control?连接记录恢复

简介:Dameware?Mini?Remote?Control?是一款不错的局域网远程控制管理软件.?如果重做了系统或其他情况下,需要重装此程序,那么原来的连接记录都要重建,下面详细介绍怎么解决这个问题.?本文使用的是Dameware?Mini?Remote?Control?v7.5?版,64位win7系统. 一.原始数据备份1.连接数据?如图这个位置的这个MRCCv2.db文件就是连接的数据(IP地址).C:\Users\Administrator\AppData\Roaming\DameWa

DMI ( Dynamic Method Invocation )

功能: 点击 hello , 调用 execute 函数 点击 update , 调用 update 函数 1.项目结构 2.web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/java

C# Method invocation is skipped

相信大家看到这个标题也是一头雾水了. 这个问题主要是我在项目中遇到了一个问题, 然后我通过搜索引擎搜索的关键词进而找到了answer, 我先描述一下我遇到的问题: 做项目的时候我发现log时常没有输出, 就是有log文件生成但是里面并没有任何内容. 我好奇这个问题并开始寻找问题原因. 项目中用的log类是.net提供的System.Diagnostics.TraceSource, 并不是像我之前做项目时候都是引用的自己写的log类, 这个类我之前也没有用过, 从网上查了一些资料发现还是很灵活的,