`
Wind_ZhongGang
  • 浏览: 264079 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

RMI初探

阅读更多

  RMI(Remote Method Invocation),远程方法调用,即本地调用远程主机的服务,使用RMI能实现如同在调用本地方法似的效果,也就是说能够实现分布式应用。

 

  一。Chat 远程方法接口需要继承Remote接口,并且远程接口的所有方法必须抛出RemoteException

 

package com.template.rmi;

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

/**
 * Created by IntelliJ IDEA.
 * User: Zhong Gang
 * Date: 11-8-4
 * Time: 下午9:04
 */
public interface Chat extends Remote {

    void send(String message) throws RemoteException;

    String receive() throws RemoteException;
}

 

  二。ChatImpl 远程接口的实现类 需要继承UnicastRemoteObject类,并实现Chat接口

 

package com.template.rmi;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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

/**
 * Created by IntelliJ IDEA.
 * User: Zhong Gang
 * Date: 11-8-4
 * Time: 下午9:05
 */
public class ChatImpl extends UnicastRemoteObject implements Chat {

    private Logger logger = LoggerFactory.getLogger(ChatImpl.class);

    protected ChatImpl() throws RemoteException {
        super();
    }

    @Override
    public void send(String message) throws RemoteException {
        logger.info("Sending a message!");
        logger.info(message);
        logger.info("Sended a message!");
    }

    @Override
    public String receive() throws RemoteException {
        logger.info("Received a message!");
        return "This is a received message content!";
    }
}

 

  三。ChatServer 远程服务注册

 

package com.template.rmi;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;

/**
 * Created by IntelliJ IDEA.
 * User: Zhong Gang
 * Date: 11-8-4
 * Time: 下午9:10
 */
public class ChatServer implements Runnable {

    private Logger logger = LoggerFactory.getLogger(ChatServer.class);

    @Override
    public void run() {
        try {
            logger.info("Server start!");
            logger.info("Initialize chat service!");
            ChatImpl chat = new ChatImpl();
            logger.info("Bind the chat service to  the server!");
            Naming.rebind("chat", chat);
            logger.info("Server has started the chat service!");
        } catch (RemoteException e) {
            logger.error(e.getMessage());
        } catch (MalformedURLException e) {
            logger.error(e.getMessage());
        }
    }
}

 

  四。ChatClient 本地调用远程服务

 

package com.template.rmi;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

/**
 * Created by IntelliJ IDEA.
 * User: Zhong Gang
 * Date: 11-8-4
 * Time: 下午9:10
 */
public class ChatClient implements Runnable {

    private Logger logger = LoggerFactory.getLogger(ChatClient.class);

    @Override
    public void run() {
        try {
            logger.info("Find chat service from server!");
            Chat chat = (Chat) Naming.lookup("//127.0.0.1/chat");
            logger.info("Sending a message to the server!");
            chat.send("This is a message from client to server!");
            logger.info("Sended a message to the server!");

            logger.info("Receive a message from server!");
            String message = chat.receive();
            logger.info("The message received from server is : ");
            logger.info(message);
        } catch (NotBoundException e) {
            logger.error(e.getMessage());
        } catch (MalformedURLException e) {
            logger.error(e.getMessage());
        } catch (RemoteException e) {
            logger.error(e.getMessage());
        }
    }
}

 

 

  五。Main

 

package com.template.rmi;

/**
 * Created by IntelliJ IDEA.
 * User: Zhong Gang
 * Date: 11-8-4
 * Time: 下午10:48
 */
public class Main {

    public static void main(String[] args) {

        Runnable chatServer = new ChatServer();
        Thread server = new Thread(chatServer);
        server.run();

        Runnable chatClient = new ChatClient();
        Thread client = new Thread(chatClient);
        client.run();

    }
}

 

  六。启动rmiregistry服务器

 

  七。运行Main主类

 

  八。实现效果

  rmi

 

  附:如果想要正确启动远程服务,需要对ChatImpl类进行远程方法调用的编译,即使用rmic命令,生成ChatImpl的Stub,即存根。当然,如果使用的IDE,那IDE会帮我们做这一步的。其次,为了正确使用远程服务,需要确保远程方法调用服务器在正确的位置启动,即能够找到Stub存根的目录下。启动远程方法调用,需要使用rmiregistry命令。

  • 大小: 20 KB
1
1
分享到:
评论

相关推荐

    hadoop开发者文档

    5、Java RMI + Lucene 构建分布式检索应用初探 ................ - 17 - 6、一对多的表关联在mapreduce中的应用(续) .................. - 26 - 7、InputSplit文件格式分析................................. - 32 -...

    大数据技术 Hadoop开发者第二期 MapReduce HDFS Hive Mahout HBase 共64页.pdf

    #### 五、Java RMI + Lucene 构建分布式检索应用初探 - **技术组合**:结合 Java Remote Method Invocation (RMI) 和 Lucene 实现分布式检索应用。 - **关键技术点**: - Java RMI 的使用,实现远程方法调用功能。...

    spring in action 最新

    《Spring in Action》是Spring框架领域的一本权威著作,尤其以最新版著称。这本书以其详尽的内容和丰富的示例闻名,旨在帮助Java开发者深入理解并...无论是对Spring的初探还是深入研究,这本书都是一份不可多得的资源。

    java学习之spring2.0

    - **Spring 初探**:Spring的核心在于依赖注入(DI)和面向切面编程(AOP),提供了一个轻量级的容器来管理对象的生命周期和相互依赖关系。 - **Spring 体系**:包括Core Container(核心容器)、Data Access/...

    Spring开发指南

    在Spring初探部分,首先涉及到的是准备工作,包括安装必要的开发环境和配置工具,为构建Spring基础代码做准备。接下来,指南会介绍Spring的基础语义,特别是依赖注入(Dependency Injection,简称DI)的概念及其在...

    JumpAndRunBuilder:它应该是一个游戏,您可以在其中构建跳跃和奔跑以及其他玩家或 AI 可以“挑战它”,但现在还没有

    《构建跳跃与奔跑游戏——Java实现的JumpAndRunBuilder初探》 在游戏开发的世界里,创新和趣味性是至关重要的。"JumpAndRunBuilder"项目,正如其名,旨在提供一个平台,让玩家能够创建自己的跳跃和奔跑关卡,并且...

    开源框架 Spring Gossip

    从代理机制初探 AOP 动态代理 <br>AOP 观念与术语 Spring AOP Advices Advices 包括了Aspect 的真正逻辑,由于缝合至Targets的时机不同,Spring 提供了几种不同的 Advices。 Before ...

Global site tag (gtag.js) - Google Analytics