在java中,我们有多种可以使用的远程调用技术

1.远程方法调用(remote method invocation, RMI) 

适用场景:不考虑网络限制时(例如防火墙),访问/发布基于java的服务

 2.Caucho的Hession和Burlap

适用场景:考虑网络限制时,通过http访问/发布基于java的服务。Hession是二进制协议,Burlap是基于XML的

 3.Spring基于HTTP的远程服务(HTTP invoke)

适用场景:考虑网络限制,并希望使用基于xml或专有的序列化机制实现java序列化时,访问/发布基于Spring的服务

 4.使用JAX-RPC和JAX-WS的Web Server

适用场景:访问/发布平台独立的、基于SOAP的Web服务

 5.还有EJB技术

参考http://www.cnblogs.com/wwzyy/p/5655600.html

 这里远程方法的调用,方法的执行是在服务端执行的,客户端只是获取服务端处理完返回的结果。

一、首先开始配置服务端,建立java普通项目就行

先导入spring的jar包,这里使用的是spring4.1.1

1.配置远程调用的接口(MyServer.java)

package com.spring.rmiServer;

public interface MyServer {

    public void getMsg();

    public String getMsgById(Integer id);

    public Integer add(Integer a, Integer b);

}

2.实现类(MyServerImpl.java)

package com.spring.rmiServer;

public class MyServerImpl implements MyServer {

    @Override
public void getMsg() {
System.out.println("call getMsg.."); } @Override
public String getMsgById(Integer id) {
System.out.println("call getMsgById "+ id);
return "id is "+id;
} @Override
public Integer add(Integer a, Integer b) {
System.out.println("call add ");
return a+b;
} }

3.配置RMI服务(RMIConfig.java),使用java配置的方式

package com.spring.rmiServer;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.remoting.rmi.RmiServiceExporter; @Configuration
public class RMIConfig { //@Bean()的name默认是方法名
@Bean(name="rmiExporter")
public RmiServiceExporter rmiExporter(MyServer myServer){
RmiServiceExporter rmiExporter = new RmiServiceExporter();
rmiExporter.setService(myServer);
rmiExporter.setServiceName("My_server");
rmiExporter.setServiceInterface(MyServer.class);
//rmiExporter.setRegistryHost("localhost");
rmiExporter.setRegistryPort();//远程的端口
return rmiExporter; } @Bean(name="myServer")
public MyServer myServer(){
return new MyServerImpl();
}
}

4.启动服务

public static void main(String[] args) {

     //当出现java.net.ConnectException: Connection refused: connect,可以这样解决,指定ip地址
     System.setProperty("java.rmi.server.hostname" , "192.168.23.128" );
ApplicationContext ac = new AnnotationConfigApplicationContext(com.spring.rmiServer.RMIConfig.class);
      System.out.println("start rmi server.."); 

}

二、配置客户端

1.配置要访问的远程接口,和服务端的那个接口一模一样,实现类不用写,因为服务端已经实现了,客户端调用就行

(MyServer.java)

package com.spring.rmiServer;

public interface MyServer {

    public void getMsg();

    public String getMsgById(Integer id);

    public Integer add(Integer a, Integer b);

}

2.配置文件  (ClientContext.xml)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<!-- 要调用的接口 -->
<property name="serviceInterface" value="com.spring.rmiServer.MyServer"></property>
<!-- url -->
<property name="serviceUrl" value="rmi://192.168.23.128:1199/My_server"></property>
</bean>
</beans>

3.启动客户端(Client.java)

    public static void main(String[] args) {

        ApplicationContext app = new ClassPathXmlApplicationContext("com/spring/rmiClient/ClientContext.xml");

        MyServer myServer = app.getBean(MyServer.class);

        System.out.println(myServer.getMsgById());
}

注意:有时候会由于主机ip的原因出现拒绝访问异常

3种解决方法:

1.  服务器端添加代码: System.setProperty("java.rmi.server.hostname" , "192.168.23.128" );上面代码使用的就是这种方法。

2.  在 RMI 服务器上 root 身份登录,输入 Vi /etc/hosts ,在第一行添加 192.168.39.11     ieie

3.  若是用 spring, 则在 RmiServiceExporter 中添加属性 <property name="registryHost"  value="192.168.23.128" />

缺点:

但是它存在某种限制,RMI很难穿越防火墙,这是RMI使用任意端口来交互(这是防火墙通常不允许的)。在企业内部网络幻境中,我们通常不需要担心。但如果在互联网运行,可能会有麻烦。

还有就是RMI是基于java的,也就是说客户端和服务端必须都是由java开发,这样接口才能对得上。因为RMI使用了java的序列化机制,所以通过网络传输的对象类型必须要保证在调用两端的java运行中是完全相同的版本

Spring远程调用技术<1>-RMI的更多相关文章

  1. Spring远程调用技术<2>-Hessian和Burlap

    上篇谈到RMI技术,加上Spring的封装,用起来很方便,但也有一些限制 这里的Hessian和Burlap解决了上篇提到的限制,因为他们是基于http的轻量级远程服务. Hessian,和RMI一样 ...

  2. Spring远程调用技术<3>-Spring的HTTP Invoker

    前面提到RMI使用java标准的对象序列化机制,但是很难穿透防火墙.  另一方面,Hessian和Burlap能很好地穿透防火墙,但是使用私有的对象序列化机制. Spring提供的http invke ...

  3. 【Java EE 学习 78 中】【数据采集系统第十天】【Spring远程调用】

    一.远程调用概述 1.远程调用的定义 在一个程序中就像调用本地中的方法一样调用另外一个远程程序中的方法,但是整个过程对本地完全透明,这就是远程调用.spring已经能够非常成熟的完成该项功能了. 2. ...

  4. WebService远程调用技术

    1.---------------------------------介绍-------------------------------------------------- (1)远程调用:一个系统 ...

  5. C#远程调用技术WebService葵花宝典

    一.课程介绍 直接开门见山吧,在学习之前阿笨想问大家一句,关于WebService远程过程调用技术(RPC) 你真的会了吗?不要跟老夫扯什么WebService技术已经过时,如果你的内心有在偷偷告诉你 ...

  6. C#远程调用技术WebService修炼手册

    一.课程介绍 一位伟大的讲师曾经说过一句话:事物存在即合理!意思就是说:任何存在的事物都有其存在的原因,存在的一切事物都可以找到其存在的理由,我们应当把焦点放在因果关联的本质上.所以在本次分享课开课之 ...

  7. Spring 远程调用工具类RestTemplateUtils

    Spring 远程调用Rest服务工具类,包含Get.Post.Put.Delete四种调用方式. 依赖jar <dependency> <groupId>org.spring ...

  8. Java[2] 分布式服务架构之java远程调用技术浅析(转http://www.uml.org.cn/zjjs/201208011.asp)

    转自:http://www.uml.org.cn/zjjs/201208011.asp 在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如: ...

  9. WebService与RMI(远程调用方式实现系统间通信)

    前言 本文是<分布式java应用基础与实践>读书笔记:另外参考了此博客,感觉讲的挺好的,尤其是其中如下内容: 另外,消息方式实现系统间通信本文不涉及.RMI则只采用spring RMI框架 ...

随机推荐

  1. Oracle学习总结_day03_day04_条件查询_排序_函数_子查询

    本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! day03_条件查询_排序_函数 清空回收站: PUR ...

  2. 浅谈Slick(1)- 基本功能描述

    Slick (Scala language-integrated connection kit)是scala的一个FRM(Functional Relational Mapper),即函数式的关系数据 ...

  3. 【夯实PHP基础】PHP标准库 SPL

    PHP SPL笔记 这几天,我在学习PHP语言中的SPL. 这个东西应该属于PHP中的高级内容,看上去很复杂,但是非常有用,所以我做了长篇笔记.不然记不住,以后要用的时候,还是要从头学起. 由于这是供 ...

  4. SQL注入—我是如何一步步攻破一家互联网公司的

    最近在研究Web安全相关的知识,特别是SQL注入类的相关知识.接触了一些与SQL注入相关的工具.周末在家闲着无聊,想把平时学的东东结合起来攻击一下身边某个小伙伴去的公司,看看能不能得逞.不试不知道,一 ...

  5. Mvc传值

    提到Mvc传值我想大多数人想到的是ViewBag,自3.0之后在控制器与视图之间传值绝大多数传值用到的对象就是ViewBag.对于笔者以前做过的一些小的项目,貌似不需要考虑什么,但对于稍微大些的项目涉 ...

  6. AMD and CMD are dead之KMDjs在JS工程化的努力

    总览 kmdjs发布了最接近最终版本的0.0.4版本https://github.com/kmdjs/kmdjs,你已经完全可以在项目中使用.我已经无法用语言形容其完美程度.借用我发的微博:   模块 ...

  7. mysql时间加减函数

    先来看一个例子: select now(),now()+0; 可以看到now()函数可以返回一个时间也可以返回一个数字,就看大家如何使用.如果相对当前时间进行增加或减少,并不能直接加上或减去一个数字而 ...

  8. SU54 新建视图簇 维护数据表

    由于一些数据表的数据比较重要,不允许直接查看数据表中的数据或者通过SM30进行维护, 故可以通过新建一个视图簇的方式来实现,然后通过程序调用这个视图簇,来进行数据的维护. 运行事务码SE54 最后通过 ...

  9. OpenGL中glVertex、显示列表(glCallList)、顶点数组(Vertex array)、VBO及VAO区别

    OpenGL中glVertex.显示列表(glCallList).顶点数组(Vertex array).VBO及VAO区别 1.glVertex 最原始的设置顶点方法,在glBegin和glEnd之间 ...

  10. linux版基金看板

    程序员的吊丝们,还在害怕上班时偷偷看基金被老板发现吗?今天你们的福利来了,专属程序员吊丝一族的礼物,linux版基金看板. 优点: 1.自定义设置关注基金 2.linux系统,让别人可以以为你一直都在 ...