java rmi 是否 必要_Java学习之路-RMI学习

Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。

一、创建RMI程序的4个步骤

1、定义一个远程接口的接口,该接口中的每一个方法必须声明它将产生一个RemoteException异常。

2、定义一个实现该接口的类。

3、创建一个服务,用于发布2中定义的类。

4、创建一个客户程序进行RMI调用。

二、程序的详细实现

1.首先我们先创建一个实体类,这个类需要实现Serializable接口,用于信息的传输。

1 importjava.io.Serializable;

3 public class Student implementsSerializable {

5 privateString name;

7 private intage;

9 publicString getName() {

11 returnname;

13 }

15 public voidsetName(String name) {

17 this.name =name;

19 }

21 public intgetAge() {

23 returnage;

25 }

27 public void setAge(intage) {

29 this.age =age;

31 }

33 }

2.定义一个接口,这个接口需要继承Remote接口,这个接口中的方法必须声明RemoteException异常。

1 importjava.rmi.Remote;

3 importjava.rmi.RemoteException;

5 importjava.util.List;6 public interface StudentService extendsRemote {

12 List getList() throwsRemoteException;

14 }

3.创建一个类,并实现步骤2中的接口,但还需要继承UnicastRemoteObject类和显示写出无参的构造函数。

1 importjava.rmi.RemoteException;

3 importjava.rmi.server.UnicastRemoteObject;

5 importjava.util.ArrayList;

7 importjava.util.List;

11 public class StudentServiceImpl extends UnicastRemoteObject implements

13 StudentService {

15 public StudentServiceImpl() throwsRemoteException {

17 }

21 public List getList() throwsRemoteException {

23 List list=new ArrayList();

25 Student s1=newStudent();

27 s1.setName("张三");

29 s1.setAge(15);

31 Student s2=newStudent();

33 s2.setName("李四");

35 s2.setAge(20);

37 list.add(s1);

39 list.add(s2);

41 returnlist;

43 }

45 }

4.创建服务并启动服务

1 importjava.rmi.Naming;2 importjava.rmi.registry.LocateRegistry;

4 public classSetService {

6 public static voidmain(String[] args) {

8 try{

10 StudentService studentService=newStudentServiceImpl();

12 LocateRegistry.createRegistry(5008);//定义端口号

14 Naming.rebind("rmi://127.0.0.1:5008/StudentService", studentService);

16 System.out.println("服务已启动");

18 } catch(Exception e) {

20 e.printStackTrace();

22 }

24 }

26 }

5. 创建一个客户程序进行RMI调用。

1 importjava.rmi.Naming;

3 importjava.util.List;

5 public classGetService {

9 public static voidmain(String[] args) {

11 try{

13 StudentService studentService=(StudentService) Naming.lookup("rmi://127.0.0.1:5008/StudentService");

15 List list =studentService.getList();

17 for(Student s : list) {

19 System.out.println("姓名:"+s.getName()+",年龄:"+s.getAge());

21 }

23 } catch(Exception e) {

25 e.printStackTrace();

27 }

29 }

33 }

6.控制台显示结果

=============控制台============

姓名:张三,年龄:15

姓名:李四,年龄:20

===============================

在Spring中配置Rmi服务

将Rmi和Spring结合起来用的话,比上面实现Rmi服务要方便的多。

1.首先我们定义接口,此时定义的接口不需要继承其他接口,只是一个普通的接口

1 packageservice;

3 importjava.util.List;

5 public interfaceStudentService {

7 ListgetList();

9 }

2.定义一个类,实现这个接口,这个类也只需实现步骤一定义的接口,不需要额外的操作

1 packageservice;

4 importjava.util.ArrayList;

6 importjava.util.List;

9 public class StudentServiceImpl implementsStudentService {

11 public ListgetList() {

13 List list=new ArrayList();

15 Student s1=newStudent();

17 s1.setName("张三");

19 s1.setAge(15);

21 Student s2=newStudent();

23 s2.setName("李四");

25 s2.setAge(20);

27 list.add(s1);

29 list.add(s2);

31 returnlist;

33 }

35 }

3.接一下来在applicationContext.xml配置需要的信息

a.首先定义服务bean

b.定义导出服务

/>

也可以增加p:registryHost属性设置主机

c.在客户端的applicationContext.xml中定义得到服务的bean(这里的例子是把导出服务bean和客户端的bean放在一个applicationContext.xml中的)

/>

d.配置的东西就这么多,是不是比上面的现实要方便的多呀!现在我们来测试一下

1 packageservice;2 importjava.util.List;3 importorg.springframework.context.ApplicationContext;4 importorg.springframework.context.support.ClassPathXmlApplicationContext;5 public classTest {6 public static voidmain(String[] args) {7 ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");8 StudentService studentService=(StudentService) ctx.getBean("getStudentService");9 List list =studentService.getList();10 for(Student s : list) {11 System.out.println("姓名:"+s.getName()+",年龄:"+s.getAge());12 }13 }14 }

=============控制台============

姓名:张三,年龄:15

姓名:李四,年龄:20

=============================

上面的mian方法运行可能会报错,应该是spring的jar少了,自己注意添加。

第一次写博客,有不对的地方请多多指出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++将文本中的字符串一次读入到内存

这段代码是将文本文件中的全部字符读入到内存中&#xff0c;这样的速度是很快的 char buf[1024*800];int MAXS 10000000;freopen("d:\\4.txt", "rb", stdin);int len fread(buf, 1, 100000, stdin);buf[len] \0;cout << buf[10]; 转载于:https://…

JAVA写同步栈_tomcat实现的同步队列和同步栈

tomcat实现的同步队列&#xff0c;同步栈用于数据量比较固定且基本很少删除的场景&#xff0c;尽可能减少内存消耗。同步队列/** Licensed to the Apache Software Foundation (ASF) under one or more* contributor license agreements. See the NOTICE file distributed with…

IOS高级编程之二:IOS的数据存储与IO

一、应用程序沙盒 IOS应用程序职能在系统为该应用所分配的文件区域下读写文件&#xff0c;这个文件区域就是应用程序沙盒。所有的非代码文件如&#xff1a;图片、声音、映象等等都存放在此。 在mac中command&#xff0b;shift&#xff0b;G命令&#xff0c;然后输入users/用户名…

安卓投屏大师_苹果,安卓手机如何免费投屏?只要悄悄按下这里,便能轻松实现...

现在很多手机都有自带投屏功能&#xff0c;这样一来我们便可以将所看的视频&#xff0c;所玩的游戏投屏到电脑或电视上了&#xff0c;当然也需要这些设备支持投屏才行。一、无线投屏1、苹果手机苹果手机的投屏功能在哪里呢&#xff1f;只要打开苹果手机从下往上滑动&#xff0c…

java 反射解析xml_java反射获取xml元素

类名:class Person {public void run(String who){System.out.println("Person::run()" who);}public void jump(String who){System.out.println("Person::jump()" who);}public void run(){System.out.println("Person::run()");}public voi…

怎样的中奖算法能让人信服

话说写一个抽奖程序还不容易&#xff0c;不就是生成一个随机数吗&#xff0c;哪需什么算法之类的。 从技术上说&#xff0c;这确实不难。事实上&#xff0c;你怎么写都可以&#xff0c;因为程序只运行在特定的设备上&#xff0c;外人根本无法了解其中的细节。 那么问题就来了&a…

b站电脑客户端_如何将B站的flv格式的视频转换成mp4格式

经常看到B站有精彩的视频片段&#xff0c;于是想把这些视频下载保存到电脑&#xff0c;但是发现没有下载按钮&#xff0c;是不是很悲催。有些时候想从优酷、土豆网这些视频网站下载视频&#xff0c;结果却提示要先下载视频客户端才能继续下载视频&#xff0c;运气差的话&#x…

linux Packet socket (1)简单介绍

本文主要来自于linux自带的man packet手冊&#xff1a; http://man7.org/linux/man-pages/man7/packet.7.html 平时常常使用的INET套接字提供的是7层的抓包能力&#xff0c;抓上来的data直接就是tcp或者udp的payload&#xff0c;无需关心L3和L4的头部信息。 Packet套接字提供的…

asp.net 设置 excel alignment_教你如何用Python轻轻松松操作Excel、Word、CSV,一文就够了,赶紧码住!!!...

作者&#xff1a;奈何缘浅wyjhttps://juejin.im/post/6868073137263607821Python 操作 Excel常用工具数据处理是 Python 的一大应用场景&#xff0c;而 Excel 又是当前最流行的数据处理软件。因此用 Python 进行数据处理时&#xff0c;很容易会和 Excel 打起交道。得益于前人的…

java 页面输出一个页面_java学习之:一个完整页面输出信息的过程(以输出Doctor表中信息为例)...

最近在练习java程序&#xff0c;总结一下从数据库查询信息并输出到jsp页面的过程。主要数据处理在src.cn.javatest包下面项目预览1&#xff0c;配置项目根目录src目录下的druid.properties数据库信息(相当于一个数据库配置文件)里面的信息可以在下载druid中获得&#xff0c;只需…

[xsd学习]xsd介绍

一直以来项目中对xml格式的判断使用的都是dtd格式&#xff0c;直到最近才发现&#xff0c;不知何时都已经转为xsd来进行判断和校验&#xff0c;于是今天专门找资料看下&#xff0c;不得不说&#xff0c;对于这类资料的入门&#xff0c;w3cschool真是个不错的资料库&#xff0c;…

教学目标四个维度_【深度好文】体育教案中的教学目标与学习目标应如何表述...

体育教师大本营教学/训练/职业/成长强 烈 建 议 大 家 星 标 我 们教 学 路 上 ☆ 不 离 不 弃在以往看到的体育课的教案上&#xff0c;目标部分不是用教学目标就是用学习目标来表述&#xff0c;然而&#xff0c;这两种目标表达形式有没有本质区别&#xff1f;分别该如何表述…

java中检查性异常类_Java异常处理、java语言推崇使用检查类型异常

异常处理是java语言的重要特性之一&#xff0c;《Three Rules for effective Exception Handling》一文中是这么解释的&#xff1a;它主要帮助我们在debug的过程中解决下面的三个问题。什么出错了哪里出错了为什么出错java语言可以说是提供了过于完善的异常处理机制&#xff0c…

why I need a flow learn note.

1.其实学网站学安卓也写了txt的学习笔记。然后扔着&#xff0c;&#xff08;没有时间线和互动性&#xff09;&#xff0c;然后就没有然后了。 2.知识体系&#xff0c;一个月后&#xff0c;哎呦我擦&#xff0c;我会啥来着&#xff08;搞了这么久&#xff0c;深有体会&#xff0…

nodejs readfilesync 路径_Linux 磁盘多路径聚合multipath

在日常工作中我们经常遇到配置存储的多路径聚合。多路径的目的是&#xff0c;当主机HBA卡、线缆、交换机或者存储设备的控制器故障等原因造成一条物理路径失效时,服务器可以将通过此物理路径的I/O转移到其他正常的物理路径上面,应用程序不会觉察到这种改变&#xff0c;从而提高…

php考勤分析,php考勤系统

【实例简介】自己写的php学生考勤系统&#xff0c;包括开题报告&#xff0c;结题报告&#xff0c;mysql数据库【实例截图】【核心代码】PHPkaoqinsystem└── PHP考勤系统├── database│ └── kaoqin.sql├── kaoqin│ ├── addrd.php│ ├── addstd.php│ …

遥 控 器

acm.zznu.edu.cn/problem.php?id1617 遥 控 器 时间限制: 1 Sec 内存限制: 128 MB提交: 25 解决: 9[提交][状态]题目描述 Dr.Kong 有一台高级电视机&#xff0c;这台电视机可以接受100个频道&#xff08;从0到99编号&#xff09;。电视的配套遥控器有13个按钮&#xff1a; 1…

php7与golang,golang 调用 php7

执行php文件func Test_exec(t *testing.T) {engine.Initialize()ctx : &engine.Context{Output: os.Stdout,}err : engine.RequestStartup(ctx)if err ! nil {fmt.Println(err)}defer engine.RequestShutdown(ctx)err ctx.Exec("/tmp/index.php")if err ! nil {…

u 20ubuntu 安装 postfix_极力推荐和田咨询问题U型钢托盘厂家

12极力推荐和田咨询问题U型钢托盘厂家泊头市毅伽属制品有限公司坐落于河北省泊头市龙华街北4公里&#xff0c;濒临京沪、石黄高速公路以及104、307国道&#xff0c;另有廊泊路贯穿南北交通十分便利。本公司设计生产各种冷弯型钢&#xff0c;产品包括C型钢、Z型钢、U型钢、M型钢…

HTML5中lineCap端点样式遇到closePath()

定义和用法 lineCap 属性设置或返回线条末端线帽的样式。 注释&#xff1a;"round" 和 "square" 会使线条略微变长。 默认值&#xff1a;buttJavaScript 语法&#xff1a;context.lineCap"butt|round|square";属性值 值描述butt默认。向线条的每…