发表于: 2020-07-21 22:11:15

1 1228


今天完成的事情:spring 整合 RMI 

Spring RMI
RMI全称是Remote Method Invocation-远程方法调用,是纯Java的网络分布式应用系统的核心解决方案之一。Java RMI 支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。
RMI目前使用Java远程消息交换协议JRMP进行通信。由于JRMP是专为Java对象制定的,用Java RMI开发的应用系统可以部署在任何支持JRE的平台上。但由于JRMP是专为Java对象制定的,因此,RMI对于用非Java语言开发的应用系统的支持不足。不能与用非Java语言书写的对象进行通信。
知识剖析
一个正常工作的RMI系统由下面几个部分组成:
1·远程服务的接口定义
2·远程服务接口的具体实现
3·桩(Stub)和框架(Skeleton)文件
4·一个运行远程服务的服务器
5·一个RMI命名服务,它允许客户端去发现这个远程服务
6·类文件的提供者(一个HTTP或者FTP服务器)
7·一个需要这个远程服务的客户端程序
RMI的主要优点:
1. RMI是Java编写的, 具有 “编写一次,到处运行 ” 的特性。任何基于RMI的系统均可100%地移植到 任何Java虚拟机上
2. 面向对象:RMI可将完整的对象作为参数和返回值进行传递直接通过网络传输对象数据。
3.可移动属性:RMI可将属性从客户机移动到服务器,或者从服务器移到客户机。
4.设计方式:对象传递功能使您可以在分布式计算中充分利用面向对象技术的强大功能。

5.安  全:RMI使用Java内置的安全机制保证下载执行程序时用户系统的安全。


新建了两个项目  task8-Service  服务端WEB项目  和 客户端task8-Client Project项目

  

web开发,是开发服务端的,因为把你开发好的web程序,打包成war,然后放到web容器中运行,而web容器,是部署在服务器中的。
web的客户端就是浏览器,所以,我猜,这里的客户端,是不是指设计页面,类似于前端

服务端:

目录结构:

 

接口  HelloRMIService

package rmi;

public interface HelloRMIService {

public String sayHi(String name);
}

接口实现类HelloRMIServiceImp

package rmi.imp;

import rmi.HelloRMIService;

public class HelloRMIServiceImp implements HelloRMIService {

@Override
   public String sayHi(String name) {
return "Hi," + name;
   }
}

applicationContext.xml

<bean id="helloRMIServiceImpl" class="rmi.imp.HelloRMIServiceImp"> </bean>
<!-- 将一个类发布为一个RMI服务 服务端使用RmiServiceExporter暴露RMI远程方法 -->
<bean id="RMIServiceTest"  class="org.springframework.remoting.rmi.RmiServiceExporter">
   <property name="service" ref="helloRMIServiceImpl"></property>
   <property name="serviceName" value="serverRmiTest"></property>
   <property name="serviceInterface" value="rmi.HelloRMIService"></property>
   <property name="registryPort" value="1021"></property>
</bean>

main 方法启动

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class RMIServiceTest {

public static void main(String[] args){
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
       context.getBean("RMIServiceTest");
   }
}

控制台输出

可以看到一直在运行

可以看到Could not detect RMI registry - creating new one(找不到注册表,新建了一个注册表)

客户端:

目录结构

接口 HelloRMIService

package rmi;

public interface HelloRMIService {

public String sayHi(String name);
}

applicationContext.xml

!-- 客户端用RmiProxyFactoryBean间接调用远程方法。-->
<bean name="RMITest" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
   <property name="serviceUrl" value="rmi://127.0.0.1:1021/serverRmiTest"/>
   <property name="serviceInterface" value="rmi.HelloRMIService"/>
</bean>

main 方法启动

import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import rmi.HelloRMIService;

public class RMIServiceTest {

static Logger logger = Logger.getLogger(RMIServiceTest.class);
   public static void main(String[] args){
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
       HelloRMIService helloRMIService = (HelloRMIService) context.getBean("RMITest");
       logger.info(helloRMIService.sayHi("rmi"));
   }
}

控制台输出

明天计划的事情:推进任务




返回列表 返回列表
评论

    分享到