zoukankan      html  css  js  c++  java
  • RMI入门HelloWorld

    java RMI(Remote Method Invocation)是一种基于java远程调用技术,是对RPC的java实现,可以在不同主机上进行通信与方法调用。PRC通信原理如图:

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

    要完成以上步骤需要有以下几个步骤:
    1、生成一个远程接口
    2、实现远程对象(服务器端程序)
    3、生成占位程序和骨干网(服务器端程序)
    4、编写服务器程序
    5、编写客户程序
    6、注册远程对象
    7、启动远程对象
    具体实现代码如下:
    远程接口定义:
     1 package com.corearchi.rmi.api;
     2 
     3 import java.rmi.Remote;
     4 import java.rmi.RemoteException;
     5 
     6 /**
     7  * 远程接口HelloService
     8  *
     9  * @author DonnieGao
    10  * @create 2018-01-29 上午10:14
    11  **/
    12 public interface HelloService extends Remote {
    13 
    14     /**
    15      * 远程接口方法sayHello
    16      *
    17      * @param somebody 某个人
    18      * @return 返回调用接口结果
    19      * @throws RemoteException 抛出RemoteException异常
    20      */
    21     String sayHello(String somebody) throws RemoteException;
    22 }

    远程接口实现:

    package com.corearchi.rmi.impl;
    
    import com.corearchi.rmi.api.HelloService;
    
    import java.rmi.RemoteException;
    import java.rmi.server.UnicastRemoteObject;
    
    /**
     * 远程接口HelloService的实现
     *
     * @author DonnieGao
     * @create 2018-01-29 上午10:18
     **/
    public class HelloServiceImpl extends UnicastRemoteObject implements HelloService{
    
        /** 父类构造抛出异常,子类也需抛出异常 */
        public HelloServiceImpl() throws RemoteException {
        }
    
        /**
         * 远程接口方法sayHello
         *
         * @param somebody 某个人
         * @return 返回调用接口结果
         * @throws RemoteException 抛出RemoteException异常
         */
        @Override
        public String sayHello(String somebody) throws RemoteException {
            return "hello" + somebody;
        }
    }

    客户端Server实现:

     1 package com.corearchi.rmi.server;
     2 
     3 import com.corearchi.rmi.api.HelloService;
     4 import com.corearchi.rmi.impl.HelloServiceImpl;
     5 
     6 import java.net.MalformedURLException;
     7 import java.rmi.AlreadyBoundException;
     8 import java.rmi.Naming;
     9 import java.rmi.RemoteException;
    10 import java.rmi.registry.LocateRegistry;
    11 
    12 /**
    13  * 远程Rmi服务端
    14  *
    15  * @author DonnieGao
    16  * @create 2018-01-29 上午10:25
    17  **/
    18 public class HelloServer {
    19 
    20     public static void main(String[] args) throws RemoteException, AlreadyBoundException, MalformedURLException {
    21         // 创建远程服务接口
    22         HelloService helloService = new HelloServiceImpl();
    23 
    24         // 注册服务
    25         LocateRegistry.createRegistry(1234);
    26         Naming.bind("rmi://localhost:1234/helloService",helloService);
    27 
    28         System.out.println("HelloServer has started and provide RPC service at the same time");
    29     }
    30 }
     1 package com.corearchi.rmi.client;
     2 
     3 import com.corearchi.rmi.api.HelloService;
     4 
     5 import java.net.MalformedURLException;
     6 import java.rmi.Naming;
     7 import java.rmi.NotBoundException;
     8 import java.rmi.RemoteException;
     9 
    10 /**
    11  * 远程连接的客户端
    12  *
    13  * @author DonnieGao
    14  * @create 2018-01-29 上午10:29
    15  **/
    16 public class HelloClient {
    17 
    18     public static void main(String[] args) throws RemoteException, NotBoundException, MalformedURLException {
    19         // 引入远程服务
    20         HelloService helloService = (HelloService) Naming.lookup("rmi://localhost:1234/helloService");
    21 
    22         // 调用远程方法
    23         System.out.println("RMI服务器结果是 "+helloService.sayHello("Kitty"));
    24     }
    25 }

    一个简单的RMI通信Demo就完成了,先运行Server,在运行Client。


    作者:撩琼不止
    出处:https://www.cnblogs.com/codegeekgao/
    github:https://github.com/codegeekgao
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

     
  • 相关阅读:
    SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)
    Web Api 跨域解决方案
    Web Api Session开启会话支持
    Web Service 学习
    省市选择器
    如何创建圆形头像和圆角图片
    E
    二叉树
    素数筛法
    Color Me Less
  • 原文地址:https://www.cnblogs.com/codegeekgao/p/8376565.html
Copyright © 2011-2022 走看看