`

RMI学习笔记

    博客分类:
  • RMI
阅读更多

失业在家,学习RMI一例,以做记录。

创建RMI应用程序分四步。自JDK1.5之后不再需要创建存根与基干。

(1)定义和实现远端接口中的参数

(2) 定义和实现远端接口

(3) 编写服务端代码

(4) 编写客户端代码

(5) 启动rmiregistry , 并将服务注册到rmiregistry.



定义和实现远端接口中的参数

这里定义一个学生实体


Code
package rmi;
import java.io.Serializable;

public class Student implements Serializable{
   private String name;
   private int age;
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getAge() {
    return age;
}
public void setAge(int age) {
    this.age = age;
}
}



这里student定义为可序列化,这是因为客户端与服务传递参数都是byte stream的形式。然后通过反序列化成对像,才能调用方法。

定义和实现远端接口

1.定义远程接口

Code
package rmi;

import java.rmi.Remote;



public interface InfoConsult extends Remote{

    public int getAge(String name);

}

远端接口必须从java.rmi.Remote继承;远端接口中的方法如果要throws异常,这个异常必须是java.rmi.RemoteException(或java.rmi.RemoteException的子类),否则,这个异常就不能被返回到客户端 .

2.实现远程接口

package rmi;



import java.rmi.RemoteException;

import java.rmi.server.UnicastRemoteObject;

import java.util.List;



public class InfoConsultImpl extends UnicastRemoteObject implements InfoConsult{

  

    private List<Student> students;

   

    protected InfoConsultImpl(List<Student> students) throws RemoteException {

       super();

       this.students = students;

    }

    private static final long serialVersionUID = -3359466943165065842L;

    public int getAge(String name) throws RemoteException{

       for(Student stu:students){

           if(stu.getName().equals(name)){

              return stu.getAge();

           }

       }

       return -1;

    }

}



编写服务代码


Code
package rmi;



import java.net.MalformedURLException;

import java.rmi.Naming;

import java.rmi.RemoteException;

import java.util.ArrayList;

import java.util.List;



public class InfoServer {

    public static void main(String args[]) throws RemoteException, MalformedURLException{

    InfoServer server = new InfoServer();

    InfoConsult consult = new InfoConsultImpl(server.getMockData());

    Naming.rebind("rmi://localhost:8888/InfoConsult", consult);

   

    }

   

    public List<Student> getMockData(){

    List<Student> lst = new ArrayList<Student>();

    lst.add(new Student("guo",26));

    lst.add(new Student("zhang",24));

    lst.add(new Student("baby",1));

    return lst;

    }

}



编写客户端代码


Code
package rmi;

import java.net.MalformedURLException;

import java.rmi.Naming;

import java.rmi.NotBoundException;

import java.rmi.RemoteException;



public class School {

     public static void main(String args[]){

     try {

           InfoConsult consult = (InfoConsult) Naming.lookup("rmi://localhost:8888/InfoConsult");

           System.out.println(consult.getAge("baby"));

       } catch (MalformedURLException e) {

           e.printStackTrace();

       } catch (RemoteException e) {

           e.printStackTrace();

       } catch (NotBoundException e) {

           e.printStackTrace();

       }

     }

}



启动rmiregistry , 并将服务注册到rmiregistry

在服务程序目录下启动rmiregistry 8888或者将classpath设定为服务器程序所在目录。

运行服务端程序,运行客户端程序。可以看到输出1。



这里没有产生存根与基干程序。JDK1.5的RMIC命令默认情况下不再产生基干程序,仅产生存根程序。

那什么时候用到存根程序呢,我做了试验,当服务端有存根程序存在时,而客户端没有存根程序,这里客户端就会报错,说没有找到CLASSNAME_STUB。具体原因还不明,有知道的可留言,谨谢.

 

分享到:
评论

相关推荐

    rmi学习笔记(1)

    rmi基础知识学习笔记,从最简单的例子讲述rmi的用途

    JavaEE5学习笔记02-JNDI与RMI

    JavaEE5学习笔记02-JNDI与RMI.

    递归调用学习笔记

    java递归调用原码,来原于马老师视频内容,并做了一些个人的分析小改动,希望对你有帮助

    分布式技术相关知识学习笔记

    有关分布式的一点学习笔记,都是重点的技术,从概念和技术上分析对比了各种分布式技术的差异

    JAVA RIM接口学习笔记 带有实例

    非常详细java RMI接口编程笔记,实例 且带有详细的说明。

    学习笔记:JAVA RMI远程方法调用简单实例

    RMI的概念  RMI(Remote Method Invocation)远程方法调用是一种计算机之间利用远程对象互相调用实现双方通讯的一种通讯机制。使用这种机制,某一台计算机上的对象可以调用另外一台计算机上的对象来获取远程数据。...

    rmi代码

    我感觉不错的rmi代码; 大家可以参考学习!里面有我的笔记!如有不明白可以发送 E-mail:heitu278@163.com&lt;br&gt;&lt;br&gt;可以直接参考这个项目:http://www.zonediy.com&lt;br&gt;&lt;br&gt;

    Java并发编程(学习笔记).xmind

    远程方法调用(RMI) 正确协同多个对象中的共享状态 正确协同远程对象本身状态的访问 Swing和AWT 事件处理器与访问共享状态的其他代码都要采取线程安全的方式实现 框架通过在框架线程中调用...

    docker学习思维笔记.xmind

    docker rmi 删除镜像 docker 运行命令 docker copy&nbsp;主机路径 容器id/名称:容器中路径&nbsp; 镜像 是什么 UnionFS(联合文件系统) 镜像加载原理 分层镜像 为什么采用这种设计 docker ...

    JavaLearnVulnerability:Java漏洞学习笔记 Deserialization Vulnerability

    JavaLearnVulnerabilityJava漏洞学习代码及笔记项目TODO 漏洞代码完善中 漏洞使用和分析笔记准备中 目前文章分析地址在每一个包下package-info.java Java反序列化 Java反射 Java类加载 shiro漏洞分析 weblogic漏洞...

    java课堂笔记_自己总结的

    这里是我06.09到07.02期间,在西安itfuture培训机构学习的完毕时候整理的笔记! 主要内容: 1:基本sql语句,sqlserver和mysql的操作 2:java基础,从最基本的数据类型到数据结构,容器线程。 3:jsp...

    高级java笔试题-itresource:程序开发技术资源集合

    heavyz的Tomcat学习笔记(包括启动流程分析、启动脚本分析) ] () [ java8 新特性讲解系列文章 ] () [ Java 从Jar文件中动态加载类 ] () [ Java并发源码分析 - ThreadPoolExecutor ] () [ java ClassLoader 基本原理 ]...

    水木清华站∶Java版精华区 含jsp及js等集合.chm

    [目录]Java学习笔记(推荐) 6. [目录]JDBC文档 7. [目录]RMI 文档 2. [目录]Java资源(文档-书籍-下载-注册码) 1. [目录]License 和注册码 2. [目录]好书推荐 3. [目录]关于Java的...

    Java网络编程(第3版) 中文版

    本书内容全面,涵盖了从网络基础知识到远程方法调用(RMI)等各方面的内容,书中章节涉及到TCP和UDP socket、服务器socket、URL和URI、组播以及特殊用途的API(如JavaMail)等等。本书展示了如何使用JSSE编写安全的...

    Java网络编程(第3版) 中文版 文件2

    本书内容全面,涵盖了从网络基础知识到远程方法调用(RMI)等各方面的内容,书中章节涉及到TCP和UDP socket、服务器socket、URL和URI、组播以及特殊用途的API(如JavaMail)等等。本书展示了如何使用JSSE编写安全的...

Global site tag (gtag.js) - Google Analytics