Spring远程调用技术<1>-RMI
在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的更多相关文章
- Spring远程调用技术<2>-Hessian和Burlap
上篇谈到RMI技术,加上Spring的封装,用起来很方便,但也有一些限制 这里的Hessian和Burlap解决了上篇提到的限制,因为他们是基于http的轻量级远程服务. Hessian,和RMI一样 ...
- Spring远程调用技术<3>-Spring的HTTP Invoker
前面提到RMI使用java标准的对象序列化机制,但是很难穿透防火墙. 另一方面,Hessian和Burlap能很好地穿透防火墙,但是使用私有的对象序列化机制. Spring提供的http invke ...
- 【Java EE 学习 78 中】【数据采集系统第十天】【Spring远程调用】
一.远程调用概述 1.远程调用的定义 在一个程序中就像调用本地中的方法一样调用另外一个远程程序中的方法,但是整个过程对本地完全透明,这就是远程调用.spring已经能够非常成熟的完成该项功能了. 2. ...
- WebService远程调用技术
1.---------------------------------介绍-------------------------------------------------- (1)远程调用:一个系统 ...
- C#远程调用技术WebService葵花宝典
一.课程介绍 直接开门见山吧,在学习之前阿笨想问大家一句,关于WebService远程过程调用技术(RPC) 你真的会了吗?不要跟老夫扯什么WebService技术已经过时,如果你的内心有在偷偷告诉你 ...
- C#远程调用技术WebService修炼手册
一.课程介绍 一位伟大的讲师曾经说过一句话:事物存在即合理!意思就是说:任何存在的事物都有其存在的原因,存在的一切事物都可以找到其存在的理由,我们应当把焦点放在因果关联的本质上.所以在本次分享课开课之 ...
- Spring 远程调用工具类RestTemplateUtils
Spring 远程调用Rest服务工具类,包含Get.Post.Put.Delete四种调用方式. 依赖jar <dependency> <groupId>org.spring ...
- Java[2] 分布式服务架构之java远程调用技术浅析(转http://www.uml.org.cn/zjjs/201208011.asp)
转自:http://www.uml.org.cn/zjjs/201208011.asp 在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如: ...
- WebService与RMI(远程调用方式实现系统间通信)
前言 本文是<分布式java应用基础与实践>读书笔记:另外参考了此博客,感觉讲的挺好的,尤其是其中如下内容: 另外,消息方式实现系统间通信本文不涉及.RMI则只采用spring RMI框架 ...
随机推荐
- Java动态代理全面分析
代理模式 解说:给某一个对象提供一个代理,并由代理对象控制对原对象的引用: 代理模式需要以下几个角色: 1 主题:规定代理类和真实对象共同对外暴露的接口: 2 代理类:专门代理真实对象的类: 3 ...
- 【夯实Mysql基础】记一次mysql语句的优化过程
1. [事件起因] 今天在做项目的时候,发现提供给客户端的接口时间很慢,达到了2秒多,我第一时间,抓了接口,看了运行的sql,发现就是 2个sql慢,分别占了1秒多. 一个sql是 链接了5个表同时使 ...
- 能力素质模型咨询工具(Part1)
之前写过由企业家基本素质想到的文章,里面提及一些能力与素质,以下有内容也可以参考: 领导职位 表6-1 远见卓识的行为表现 级 别 行 为 表 现 A (1)关注行业的前景和环境的变化, ...
- 服务器判断http是否中断
一般来说,只需要send或者recv一下,如果结果为零,则为掉线. 1.当recv返回值为0是表示对方已经正常(MSDN说是完美的)的断开连接.2.当recv返回SOCKET_ERROR时,说明对方已 ...
- 十一个行为模式之访问者模式(Visitor Pattern)
定义: 提供一个作用于某对象结构(通常是一个对象集合)的操作的接口,使得在添加新的操作或者在添加新的元素时,不需要修改原有系统,就可以对各个对象进行操作. 结构图: Visitor:抽象访问者类,对元 ...
- Apache Lucene(全文检索引擎)—搜索
目录 返回目录:http://www.cnblogs.com/hanyinglong/p/5464604.html 本项目Demo已上传GitHub,欢迎大家fork下载学习:https://gith ...
- OO方式下,ALV TREE和ALV GRID的不同之处
作为大部分报表程序的基础,ALV GRID差不多是每个ABAP开发者必须了解和掌握的内容,因此网上也不乏相关资料,而ALV TREE的应用相对较少,中文资料也就比较少见了.实际上,ALV TREE和A ...
- XSS跨站测试代码大全
'><script>alert(document.cookie)</script>='><script>alert(document.cookie)&l ...
- 自己实现苹果安装app动画
最近在学习CALayer相关动画,然后某一天突然发现苹果安装app这动画就很不错啊,所以就想自己实现下. 具体效果如图: 还是不试不知道一试吓一跳啊,这看上去简单的动画没我想象的那么简单. 首先这个动 ...
- 【代码笔记】iOS-忘记密码选择整体button
一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @class BECheckBox; @interface ...