java rmi浅谈

首先比较下RPC和RMI的差别:

首先java提供了RMI的api,jdk1.5之后虚拟机自动生成两个类:存根类stub和骨架类skelton。 stub是给客户端的,当客户端调用远程对象的一个方法时,实际上是调用本地存根对象的相应方法。skelton负责在服务端为远程对象接受客户端的请求。RMI必须要有JVM支持,所以,如果C,S都使用java开发,可以考虑使用RMI。

RPC可以跨语言,客户端请求参数中就带有需要调用的类,方法及参数

----------------------------------------以上是个人理解----------------------------------------------------

下面3个区别转自:http://blog.csdn.net/shan9liang/article/details/8995023

(1)RPC 跨语言,而 RMI只支持Java。

(2)RMI 调用远程对象方法,允许方法返回 Java 对象以及基本数据类型,而RPC 不支持对象的概念,传送到 RPC 服务的消息由外部数据表示 (External Data Representation, XDR) 语言表示,这种语言抽象了字节序类和数据类型结构之间的差异。只有由 XDR 定义的数据类型才能被传递, 可以说 RMI 是面向对象方式的 Java RPC 。

(3)在方法调用上,RMI中,远程接口使每个远程方法都具有方法签名。如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口上,那么这个新方法就不能被RMI客户方所调用。

在RPC中,当一个请求到达RPC服务器时,这个请求就包含了一个参数集和一个文本值,通常形成“classname.methodname”的形 式。这就向RPC服务器表明,被请求的方法在为 “classname”的类中,名叫“methodname”。然后RPC服务器就去搜索与之相匹配的类和方法,并把它作为那种方法参数类型的输入。这里 的参数类型是与RPC请求中的类型是匹配的。一旦匹配成功,这个方法就被调用了,其结果被编码后返回客户方。

远程对象需继承Remote接口,每个方法都需要throws RemoteException, 通过此接口提供业务功能,然后将其绑定到某个端口上提供远程服务

public interface Business extends Remote {
    public String echo(String message) throws RemoteException;
}
public class BusinessImpl implements Business {

    @Override
    public String echo(String message) throws RemoteException {
        if("quit".equalsIgnoreCase(message)){
            System.out.println("server will be shut down");
            System.exit(0);
        }
        return "server response" + message;
    }
}

server:

public class Server {
    public static void main(String[] args) throws RemoteException{
        int port = 1233; //该端口负责提供服务
        String name = "BusinessDemo";
        Business business = new BusinessImpl();
        UnicastRemoteObject.exportObject(business,port);  //如果BusinessImpl继承了UnicastRemoteObject  这行代码可以不写
        Registry registry = LocateRegistry.createRegistry(1234); //该端口负责注册与查询服务,客户端只需要知道这个端口号就行了
        registry.rebind(name, business);
    }
}

client:

public class Client {
    public static void main(String[] args) throws RemoteException, NotBoundException{
        Registry registry = LocateRegistry.getRegistry("127.0.0.1",1234); //如果cs要布在两台机器上,这儿的ip填server的ip即可
        String name = "BusinessDemo";
        Business business = (Business) registry.lookup(name); //执行到这儿的时候才访问server
        System.out.print(business.echo("hello"));
    }
}
时间: 2024-10-20 21:08:34

java rmi浅谈的相关文章

java serialize 浅谈

对象的串行化(Serialization) 一.串行化的概念和目的 1.什么是串行化             对象的寿命通常随着生成该对象的程序的终止而终止.有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复.我们把对象的这种能记录自己的状态以便将来再生的能力.叫作对象的持续性(persistence).对象通过写出描述自己状态的数值来记录自己 ,这个过程叫对象的串行化(Serialization) .串行化的主要任务是写出对象实例变量的数值.如果交量是另一对象的引用,则引用的对象也要串

java多线程浅谈

经常看到,一个对象的synchronized方法被一个线程调用后,那么其他线程还能调用该线程的其他方法吗? 网上给出各种答案,其中一种是:不能. 但是,我们有没有自己动手去写一个简单的程序来验证一下?从这个问题浅谈一下我对java多线程的理解. 要理解java的多线程,首先的理解jvm. 参见http://blog.csdn.net/kyfg27_niujin/article/details/7942006

关于java线程浅谈五: Condition条件

在面试的过程当中,在面试官提出问题的时候,往往会就问题本身引申出较深层次的问题.比如:你使用过with语句吗?我的回答是:with语句经常适用于对资源进行访问的场合,确保在访问的过程中不管是否发生异常都会指执行必要的清理操作,比如文件的自动关闭以及线程中锁的自动获取与释放.面试官紧接着问,那你知道为什么with语句能够使文件正确关闭,一下子把我问闷了,只能依稀记得with语句会开辟出一块独立环境来执行文件的访问,类似沙盒机制.面试官对这个答案不置可否,算是勉强通过了.所以知其然更要知其所以然.在

java - 异常浅谈

java提供异常处理机制中,可以分为RuntimeException和checked Exception两种. RuntimeException 是运行时异常,是程序本身无法解决的.例如,对于一个用户注册网站,如果当前用户名已经被使用,则解决方案只能是当前用户使用新的用户名, 而程序本身是无法解决的(我们总不能通过程序将原有用户名删除,不给他使用,然后给当前用户注册吧...). 企业开发中,一般自定义(给用户反馈信息)的异常偏向于使用RuntimeException,这是因为,方法的调用者不需要

java笔试浅谈

从第一份笔试到现在已经有差不多一个月了,记得自己第一份笔试就是腾讯的.那时就是抱着量力而为的心情去参加的,果然,整份试题有不少知识自己是没见过的,有一些知识是学过但忘记了的,所以,那次笔试就是去做"炮灰"了.接下来又陆续参加了不少名企校招的笔试,但结果都不尽人意!特别是跟同班两位朋友一起去参加高新兴的java工程师,结果他们都过了笔试,而我却没过!那时,感觉到挺沮丧的,记得当时是在中大参加笔试的,然后自己再教室外面静静等待他们面试!那等待的一个多小时,自己静静反省了好多,得出了原来自己

Java入门浅谈

首先了解Java的版本:JavaME.JavaSE(主要来创建桌面应用,有独立的安装程序,例如:Windows.msi等).JavaEE(在JavaSE基础上构建,主要提供Web服务,管理等).然后就是Java的语言特点,不同于C语言,C语言直接语言运行编译成机器码执行,效率高:而Java会首先生成一个class文件(也就是字节码),再解释成机器码在运行.

java集合浅谈一二

首先是从其他地方摘录过来的东西,以便查看,后续会进行补充或修改 先谢谢他们的文章,让我理解地更清楚 Java集合框架之小结 http://jiangzhengjun.iteye.com/blog/553191 Java之集合类应用总结 http://www.cnblogs.com/devinzhang/archive/2012/01/25/2329434.html JAVA集合小结 http://www.blogjava.net/EvanLiu/archive/2007/11/12/159884

Java注解浅谈

注解定义(来自百度百科):指示编译器如何对待您的自定义 Annotation,预设上编译器会将Annotation资讯留在class档案中,但不被虚拟机器读取,而仅用于编译器或工具程式运行时提供资讯. 随着零配置的流行,注解的使用也越来越大众化,注解的学习也很有必要.最近学习了下Spring的几个注解,这里与大家分享下自己对注解的理解.首先我们来看下@Controller这个注解的源码: ? 1 2 3 4 5 6 7 8 9 10 package org.springframework.ste

java - String 浅谈

/** * String s1 = "a"; * 编译器会先检查常量池中是否已经有"a": * 如果没有,则在常量池先创建,后引用. * 如果有,则直接引用; * 所以执行该语句,会产生0个或1个对象. * 这里,会创建1个对象. */ String s1 = "a"; /** * String s2 = new String("a"); * 编译器先在堆中创建一个对象,然后去常量池中检查是否已有"a":