Java远程技术介绍学习

38 篇文章 0 订阅
2 篇文章 0 订阅

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:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小_杭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值