Java远程技术介绍学习

Java远程技术介绍学习


RMI

【既Remote Method Invoke 远程方法调用】

实现方式为,类extend了java.rmi.Remote接口,即成为存在于服务器端的远程对象,提供客户端访问。

PS: extends了Remote接口的类或者其他接口中的方法若是声明抛出了RemoteException异常,则表明该方法可被客户端远程访问调用。

同时,远程对象必须实现java.rmi.server.UniCastRemoteObject类,这样才能保证客户端访问获得远程对象时,该远程对象将会把自身的一个拷贝以Socket的形式传输给客户端,此时客户端所获得的这个拷贝称为“存根”,而服务器端本身已存在的远程对象则称之为“骨架”。其实此时的存根是客户端的一个代理,用于与服务器端的通信,而骨架也可认为是服务器端的一个代理,用于接收客户端的请求之后调用远程方法来响应客户端的请求。

交易时序图:

简单示例

/**
* 定义一个远程接口,必须继承Remote接口,其中需要远程调用的方法必须抛出RemoteException异常
*/
public interface IHello extends Remote {
    /**
     * 简单的返回“Hello World!"字样
     * @return 返回“Hello World!"字样
     * @throws java.rmi.RemoteException
     */
    public String helloWorld() throws RemoteException;
    /**
     * 一个简单的业务方法,根据传入的人名返回相应的问候语
     * @param someBodyName  人名
     * @return 返回相应的问候语
     * @throws java.rmi.RemoteException
     */
    public String sayHelloToSomeBody(String someBodyName) throws RemoteException;
}
/** 远程的接口的实现 */
public class HelloImpl extends UnicastRemoteObject implements IHello {
    /**
     * 因为UnicastRemoteObject的构造方法抛出了RemoteException异常,因此这里默认的构造方法必须写,必须声明抛出RemoteException异常
     * @throws RemoteException
     */
    public HelloImpl() throws RemoteException {
    }
    /**
     * 简单的返回“Hello World!"字样
     *
     * @return 返回“Hello World!"字样
     * @throws java.rmi.RemoteException
     */
    public String helloWorld() throws RemoteException {
        return "Hello World!";
    }
    /**
     * 一个简单的业务方法,根据传入的人名返回相应的问候语
     * @param someBodyName 人名
     * @return 返回相应的问候语
     * @throws java.rmi.RemoteException
     */
    public String sayHelloToSomeBody(String someBodyName) throws RemoteException {
        return "你好," + someBodyName + "!";
    }
}
/**
* 创建RMI注册表,启动RMI服务,并将远程对象注册到RMI注册表中。 */
public class HelloServer {
    public static void main(String args[]) { 

        try {
            //创建一个远程对象
            IHello rhello = new HelloImpl();
            //本地主机上的远程对象注册表Registry的实例,并指定端口为8888,这一步必不可少(Java默认端口是1099),必不可缺的一步,缺少注册表创建,则无法绑定对象到远程注册表上
            LocateRegistry.createRegistry(8888); //加上此程序,就可以不要在控制台上开启RMI的注册程序,1099是RMI服务监视的默认端口

            //把远程对象注册到RMI注册服务器上,并命名为RHello
            //绑定的URL标准格式为:rmi://host:port/name(其中协议名可以省略,下面两种写法都是正确的)
            Naming.bind("rmi://localhost:8888/RHello",rhello);
//            Naming.bind("//localhost:8888/RHello",rhello); 

            System.out.println(">>>>>INFO:远程IHello对象绑定成功!");
        } catch (RemoteException e) {
            System.out.println("创建远程对象发生异常!");
            e.printStackTrace();
        } catch (AlreadyBoundException e) {
            System.out.println("发生重复绑定对象异常!");
            e.printStackTrace();
        } catch (MalformedURLException e) {
            System.out.println("发生URL畸形异常!");
            e.printStackTrace();
        }
    }
}
/**  客户端测试,在客户端调用远程对象上的远程方法,并返回结果。 */
public class HelloClient {
    public static void main(String args[]){
        try {
            //在RMI服务注册表中查找名称为RHello的对象,并调用其上的方法
            IHello rhello =(IHello) Naming.lookup("rmi://localhost:8888/RHello");
            System.out.println(rhello.helloWorld());
            System.out.println(rhello.sayHelloToSomeBody("熔岩"));
        } catch (NotBoundException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}

PS:

RMI对服务器的IP地址和端口依赖很紧密,但是在开发的时候不知道将来的服务器IP和端口如何,但是客户端程序依赖这个IP和端口。

RMI的局限性之一,两种解决途径:一是通过DNS来解决,二是通过封装将IP暴露到程序代码之外。

RMI的局限性之二是RMI是Java语言的远程调用,两端的程序语言必须是Java实现,对于不同语言间的通讯可以考虑用Web Service或者公用对象请求代理体系(CORBA)来实现。

【以上这个demo来自:http://lavasoft.blog.51cto.com/62575/91679/

【其他知识 : http://www.blogjava.net/zhenyu33154/articles/320245.html 里面有Spring 对RMI的支持的东东 】


CXF/Axis2

简介:

Axis2是Apache下的一个重量级WebService框架,准确说它是一个Web Services / SOAP / WSDL 的引擎,它能不但能制作和发布WebService,而且可以生成Java和其他语言版WebService客户端和服务端代码。但是包灰常的大,不好打包部署。

CXF是Apache旗下一个重磅的SOA简易框架,它实现了ESB(企业服务总线)。CXF是XFire和Celtix项目的结合产品。

【CXF支持Spring,Axis2支持其他语言】

[至于这两个框架的远程技术,╮(╯_╰)╭不管了 ]

【来源:http://www.cnblogs.com/growup/archive/2011/03/06/1972464.html


Hessian

简介:

Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能。

采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。

支持N多的语言!

实现事项:

- 服务端实现接口功能,配置web.xml和相应的servlet 。【对象必须序列化,复杂对象使用Map的方法传递】

- 客户端 需要包含Hessian(服务端的服务).jar ,然后使用HessianProxyFactory调用远程接口。

【其可以与Spring整合(不过我不觉得有什么用╮(╯_╰)╭) 】

[来源地址: http://www.cnblogs.com/yjmyzz/p/hessian-helloworld.html ]


Thrift

**介绍:

支持多语言的远程服务调用框架。支持多种数据传输协议,代码生成引擎?(编译器代码生成)。

传输数据使用二进制格式,对于高并发和大数据量有一定优势。**

官网地址:thrift.apache.org

实现方式:

- 编写Thrift文件文件,由编译器生成目录文件等东东。

- 之后编写接口,实现,服务的东东。

- 大概就酱紫

【来源 : http://www.micmiu.com/soa/rpc/thrift-sample/

[来源 : http://www.ibm.com/developerworks/cn/java/j-lo-apachethrift/#ibm-pcon]


Mina

介绍:

是Apache Mina是一个能够帮助用户开发高性能和高伸缩性网络应用程序的框架。它通过Java nio技术基于TCP/IP和UDP/IP协议提供了抽象的、事件驱动的、异步的API

这个东西好奇怪,是使用Socket进行连接通信,而后,Mina对IO流进行多重的套接转换处理。

不知道这个在什么地方可以用到?_?

[来源: http://www.cnblogs.com/xuekyo/archive/2013/03/06/2945826.html ]


其他

  • burlap
  • spring-ws
  • jms-ActiveMQ


2016-07-22 星期五 :clap:


时间: 2024-10-27 07:24:55

Java远程技术介绍学习的相关文章

学习Java需要学哪些内容?最全的java相关技术介绍

1.JDBC(Java Database Connectivity)提供连接各种关系数据库的统一接口,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC为数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,使数据库开发人员能够用纯 Java API 编写数据库应用程序. 2.EJB(Enterprise JavaBeans)使得开发者方便地创建.部署和管理跨平台的基于组件的企业应用. 3.Java RMI(Java Remote Method

一位资深程序员大牛给予Java提升技术的学习路线建议

15套java架构师.集群.高可用.高可扩 展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布 式项目实战视频教程 视频课程包含: 高级Java架构师包含:Spring boot.Spring  cloud.Dubbo.Redis.ActiveMQ.Nginx.Mycat. Spring.MongoDB.ZeroMQ.Git.Nosql.Jvm.Mecached.Netty.Nio.Mina.性能调优.高并发.

(一)java三大技术介绍及java的由来

一.Java内容介绍 Java编程可以分为三个方向(java技术的三大版本): 适用于桌面系统的Java 2平台标准版(Java2 Platform Standard Edition,Java SE). 适用于创建服务器应用程序和服务的Java 2平台企业版(Java2 Platform Enterprise Edition,Java EE). 适用于小型设备和智能卡的Java2平台Micro版(Java2 Platform Micro Edition,JavaME). 简单来说JavaSE(也

深入分析java web技术内幕 学习笔记

在Java虚拟机规范中将Java运行时数据划分为6种,(其中的域即类的成员)分别为: ◎  PC寄存器数据: 它用于保存当前正常执行的程序的内存地址, JVM规范只定义了Java方法需要记录指针信息,而对于Native方法,并没有要求记录执行的指针地址.pc寄存器所指向的也是当前活动栈(栈顶, 即当前执行的方法)地址 ◎  Java栈: 与线程密切相关, 线程中的每个调用的方法都会在栈中有一个对应的栈针,栈中主要存放一些基本类型的变量数据(int.short.long.byte.float.do

Java反射技术初级学习总结

反射机制是Java成为动态语言的一个关键特性,在运行中的Java程序对自身进行检查,或者说“内省”,并能直接操作程序的内部属性,这个机制允许程序在执行时可以通过反射API取得任何一个已知名称的类的信息,并能在执行时改变类的成员变量的内容或执行方法. 反射包:Java.lang.reflect.* Constructor(构造器) Method(方法) Filed(属性) 获得Class对象的三种方法: (1)通过Class.forName("完整的类名") 如:Class temp=C

Java远程通讯可选技术及原理

Java远程通讯可选技术及原理——转 在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术, 例如:RMI.MINA.ESB.Burlap.Hessian.SOAP.EJB和JMS等,这些名词之间到底是些什么关系呢,它们背后到底是基于什么原理实现的呢, 了解这些是实现分布式服务框架的基础知识,而如果在性能上有高的要求的话,那深入了解这些技术背后的机制就是必须的了, 在这篇blog中我们将来一探究竟,抛砖引玉,欢迎大家提供更多的实现远程通讯的技术

分布式服务架构之java远程调用技术浅析

分布式服务架构之java远程调用技术浅析     在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI.MINA.ESB.Burlap.Hessian.SOAP.EJB和JMS等,这些名词之间到底是些什么关系呢,它们背后到底是基于什么原理实现的呢,了解这些是实现分布式服务框架的基础知识,而如果在性能上有高的要求的话,那深入了解这些技术背后的机制就是必须的了,在这篇blog中我们将来一探究竟,抛砖引玉,欢迎大家提供更多的实现远程通讯

Java分布式应用技术架构介绍

分布式架构的演进 系统架构演化历程-初始阶段架构 初始阶段 的小型系统 应用程序.数据库.文件等所有的资源都在一台服务器上通俗称为LAMP 特征: 应用程序.数据库.文件等所有的资源都在一台服务器上. 描述: 通常服务器操作系统使用linux,应用程序使用PHP开发,然后部署在Apache上,数据库使用Mysql,汇集各种免费开源软件以及一台廉价服务器就可以开始系统的发展之路了. 系统架构演化历程-应用服务和数据服务分离 好景不长,发现随着系统访问量的再度增加,webserver机器的压力在高峰

Spring 4 官方文档学习 Spring与Java EE技术的集成

本部分覆盖了一下内容: Chapter 28, Remoting and web services using Spring -- 使用Spring进行远程和web服务 Chapter 29, Enterprise JavaBeans (EJB) integration -- EJB集成 Chapter 30, JMS (Java Message Service) -- JMS (Java 消息服务) Chapter 31, JMX Chapter 32, JCA CCI Chapter 33,