`

RMI心得 (注册端口)

    博客分类:
  • j2ee
阅读更多
虽然现在在分布式中RMI已经很少用到,但作为最简单的分布式应用,我们还是稍微了解一下好,这篇文章可能有我理解错误的地方,希望大家指出,谢谢。

RMI的基础是接口,RMI构架基于一个重要的原理:定义接口和定义接口的具体实现是分开的。

一个简单的RMI系统,一般可以分成4个文件,下面来介绍各个文件的创建和作用

第一步:创建一个远程对象接口

import java.rmi.Remote;
import java.rmi.RemoteException;

/*
* 这个接口继承自Remote,每一个定义的方法都必须抛出一个RemoteException异常对象
* 我们可供远程调用的方法就是通过这里开公开
*/
public interface IRMI extends Remote{
    public String invoke() throws RemoteException;
}

第二步:创建接口的具体实现类

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

/*
* 远程对象的实现
* 公开方法的具体实现就是这里定义的
*/
public class IRMIImpl extends UnicastRemoteObject implements IRMI {
   
    protected IRMIImpl() throws RemoteException {
        super(); // 这个实现必须有一个显式的构造函数,并且要抛出一个RemoteException异常
    }
   
    private static final long serialVersionUID = 6131922116577454476L;
   
    public String invoke() throws RemoteException {  //该方法公开
        return "hello,world!";
    }
   
    public String tryInvoke() throws RemoteException{ //该方法未公开,若要公开请在接口中定义
       return "try to remote me";
    }
}

第三步:创建RMI服务器

import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

/*
* 远程对象的注册类 该类应该在服务器端执行,执行之后
* 该机器将变为RMI服务器 客户端可以通过正确的url来访问
* 服务器上的远程对象,执行对外报露的方法
*/

public class RMIServer {
    static int port = 8888;
  
    /*
     * 创建一个Registry对象.
     * LocateRegistry用于获取名字服务或创建名字服务.
     * 调用LocateRegistry.createRegistry(int port)方法可以在某一特定端口创建名字服务,从而用户无需再手工启动rmiregistry
     * @return 返回一个Registry对象
     */
    private static Registry createRegistry() {
        Registry registry = null;
        try {
            registry = LocateRegistry.getRegistry(port); //如果该端口未被注册,则抛异常
            registry.list(); //拿到该端口注册的rmi对象
        } catch (final Exception e) {
            try {
                registry = LocateRegistry.createRegistry(port);//捕获异常,端口注册
            } catch (final Exception ee) {
                ee.printStackTrace();
            }
        }
        return registry;
    }

    /**
     * 将对象注册到rmi服务器上
     */
    public static void bind() {
        Registry registry =  createRegistry();
        try {
            IRMIImpl impl = new IRMIImpl();
            registry.rebind("mytask", impl); //这就是绑定,client里lookup必须和"mytast"一样才能远程调用impl
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

   public static void main(String[] args) {
        try {
            bind();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

上面是一种比较好的写法,如果只是要测试,可以直接在main()方法中写:

    ImplementClass ic = new ImplementClass(); //具体实现类
    Registry r = LocateRegistry.createRegistry(8888);
    r.bind("mytask", ic);
    //Naming.rebind("rmi://localhost:8888/mytask", ic); 可替换上句

1.注册一个端口  2.在注册端口绑定taskName和implementClass  3.客户端就可以通过url和taskName来找到implementClass。

第四步:创建RMI客户端

import java.rmi.Naming;

public class RMIClient {
    /**
     * 调用远程对象中的方法
     * @throws Exception
     */
    public static void getRemoteObject() throws Exception{
   
    /*得到远程发布的服务
    返回与指定 name 关联的远程对象的引用(一个stub)*/
        IRMI obj = (IRMI)Naming.lookup("rmi://localhost:"+RMIServer.port+"/mytask");  //注:通过接口拿

        System.out.println(obj.invoke()); //调用远程服务的方法
    }

    public static void main(String[] args) {
        try {
            getRemoteObject();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


运行RMI系统:启动RMI服务器,启动客户端即可。


分享到:
评论

相关推荐

    RMI开发实例源码 动态注册和静态注册

    3. **配置文件**:如`server.properties` 或 `client.properties`,可能包含了RMI注册表的地址和端口等信息。 4. **运行脚本**:用于启动服务器和客户端的脚本,可能涉及启动`rmiregistry`,运行服务器应用程序和...

    JavaRMI分布式编程心得

    ### Java RMI 分布式编程心得详解 #### 一、Java RMI 分布式编程概述 Java远程方法调用(Remote Method Invocation, RMI)是一种让位于不同Java虚拟机(Java Virtual Machine, JVM)上的对象能够互相调用彼此方法...

    spring rmi使用心得

    为了避免业务逻辑重新开发,顾使用spring rmi,把所有的bean作为rmi服务暴漏出来,在客户端只需要把项目依赖过来就ok,或者把以前的接口导入过来。 参考文档:...

    RMI接口实现

    在 ServerCSPDataSwitch 类中,我们使用 Properties 对象来读取 RMI 绑定 URL 的 IP 地址和端口,然后使用这些信息来绑定 RMI 服务。 RMI 接口实现可以帮助我们实现远程方法调用,提高系统的可扩展性和灵活性。同时...

    Rmi示例 Rmi代码示例

    - **启动RMIServer**:通过运行RmiServer,服务器端启动并监听特定端口,等待客户端连接。 2. **RMI客户端**(RmiClient): - **查找远程对象**:客户端首先需要通过`java.rmi.Naming.lookup()`或`Registry....

    rmi个人心得及sun官方教程

    远程方法调用(RMI,Remote Method Invocation)是Java平台上的一个重要特性,它允许一个对象在不同的...通过阅读《RMI心得》和官方教程,你可以更深入地理解和运用这一强大的特性,提高你的Java分布式应用开发能力。

    eclipse RMI分布式注册查询程序

    3. **启动服务器**:创建远程对象,将其注册到RMI注册表,并启动服务器监听端口。 4. **创建客户端**:查找注册表中的远程对象,调用其方法。 5. **处理异常**:RMI操作可能会抛出`RemoteException`,需要进行适当的...

    RMI分布式议程服务

    为了使这些批处理文件正常工作,需要确保JRE环境已安装,RMI相关的端口(默认为1099)未被占用,且服务器端和客户端之间的网络通信畅通。同时,由于RMI依赖于Java的序列化机制,所以远程对象及其返回值必须是可序列...

    java_rmi漏洞利用工具

    本项目使用socket直接发送数据包来攻击rmi,通过反序列化攻击rmi,双击直接运行,对1099端口的rmi服务直接进行漏洞检测。

    RMI应用实例及实验报告

    // 创建默认端口的RMI注册表 registry.rebind("MyService", new MyRemoteServiceImpl()); // 将服务绑定到注册表 ``` 客户端通过获取注册表中的服务引用,可以调用远程方法: ```java Registry registry = ...

    SpringRMI小例子

    -- RMI注册表的端口号 --> ``` 4. 启动RMI服务器:运行包含上述配置的Spring应用,RMI服务将自动注册到RMI注册表。 在"springmvcclient"文件中,我们有客户端代码。客户端通过Spring的`RmiProxyFactoryBean`来获取...

    Ehcache RMI Replicated Cluster(RMI集群)

    这通常涉及到在`ehcache.xml`配置文件中设置`replicationStrategy`为`rmi`,并提供RMI注册服务器的地址和端口。 2. **启动RMI服务**:在每个节点上,需要启动RMI注册服务器,这样其他节点才能找到并连接到它。这...

    Spring RMI

    - **注册RMI服务**:使用`<bean>`标签的`lookup-by-name`属性,将服务注册到RMI注册表。 - **配置RMI客户端**:在客户端,同样通过`<bean>`标签,使用`lookup-by-name`查找远程服务。 ### 3. Spring RMI的优势 - *...

    java rmi java rmi

    服务器程序使用RMI注册器来注册远程对象,而客户端则使用相同的工具来查找这些远程对象。 ### RMI的体系结构 RMI的体系结构可以分为三个层次: 1. **存根/骨架层**:这一层处理客户端和服务器端之间的实际方法...

    java rmi 参考文档

    对象注册表通常运行在一个已知端口上(默认为1099)。服务器启动后,会将对象以文本形式注册到对象注册表中。客户端在调用远程方法之前,必须首先联系对象注册表以获取对远程对象的访问权限。 #### 三、RMI中的对象...

    java_rmi.rar_RMI java_java.rmi

    3. **创建并注册远程对象**:在服务器端,你需要实例化远程对象,并使用`java.rmi.Naming`类的`bind()`方法将远程对象注册到RMI注册表。注册表的URL通常是"rmi://localhost/服务名"。 4. **获取远程对象引用**:在...

    rmi实例(Spring整合)

    通过配置XML,你可以设置RMI服务器的端口号、注册名等参数。 2. **基于Spring AOP的RMI**:Spring的AOP(面向切面编程)功能可以用于RMI服务的事务管理、安全控制等。你可以定义一个切面来处理这些跨切面的关注点,...

    JAVA RMI 传输 SSL加密

    1. **注册基于SSL的RMI Socket Factories**: - 在服务器(Server)和客户端(Client)上,我们需要创建并导出使用自定义的SSL套接字工厂的Registry实例。这可以通过在创建RMI Registry时指定`...

    JAVA RMI实现程序实例

    在两台机器上测试RMI应用程序时,确保防火墙设置正确,允许RMI相关的端口(默认是1099)通信。同时,需要在两台机器上安装JDK,并配置好Java环境。 通过上述步骤,我们可以实现一个简单的RMI“Hello, World”程序,...

    spring+rmi非本地实现

    - **注册远程对象**:在服务端启动时,我们需要将实现RMI接口的对象注册到RMI注册表中。这使得客户端可以通过其接口名称找到并调用它。 - **配置Spring**:在服务端,我们可以利用Spring的依赖注入(DI)特性来...

Global site tag (gtag.js) - Google Analytics