java基础十一[远程部署的rmi](阅读headfirstjava记录)

每天1990 每天1990     2022-08-04     789

关键词:

方法的调用都是发生在相同堆上的两个对象之间(同一台机器的Java虚拟机),如果想要调用另一台机器上的对象,可以通过Socket进行输入/输出。
远程过程调用需要创建出4种东西:服务器、客户端、服务器辅助设施、客户端辅助设施
 
RMI
Java的JMI提供客户端和服务器端的辅助设施对象(stub和skeleton,现在实际只用stub文件,客户端和服务端用一个)
辅助设施是实际执行通信的对象,他会让客户端感觉在调用本机,实际上辅助设施类似于代理,将客户端传送的信息通过Socket连接发送给服务端辅助设施,然后服务端辅助设施解包调用真正的服务端的服务,服务辅助设施取得结果后将他通过Socket连接返回给客户端辅助设施,客户端辅助设施解开这些信息传给客户端
 
远程的服务调用是通过java.rmi.registry来实现的。它提供了RMI注册表的一个类和两个接口,注册表绑定字符串名称和远程对象,可以通过注册表调用远程服务的某个对象
 
服务器端的service实现了远程调用的真正方法
 
技术分享
Client辅助设施和Service辅助设施是同一个文件,在服务器端生成的
 
创建远程服务
 
大致步骤如下图所示:
技术分享
 
步骤1:创建Remote接口
定义客户端会调用的方法,stub和服务都会实现此接口。远程接口定义了客户端可以远程调用的方法。
 
import java.rmi.*;
public interface MyRemote extends Remote{
     public String sayHello() throws RemoteException;
}
 
说明:
1.接口必须继承Remote
2.远程调用是有风险的,需要通过抛出一个RemoteException异常强迫客户端注意到这件事
3.远程方法的参数和返回值必须是primitive或Serializable的
 
步骤2:实现Remote接口
这个是真正执行的类,实现接口上的方法,也是客户端会调用的对象,去执行真正的工作
public class MyRemoteImp1 extends UnicastRemoteObject implements MyRemote{
     public MyRemoteImp1() throws RemoteException{}//UnicastRemoteObject会抛出RemoteException异常,构造函数抛出同样异常
     public String sayHello(){//实现Remote接口的所有方法
          return "Server says,‘Hey’"
     }
}
 
说明:
1.实现Remote的接口
2.要有与远程有关的功能,可以继承UnicastRemoteObject(UnicastRemoteObject 会抛出RemoteException异常,如果调用需要构造函数也抛出同样的异常)
3.向RMI registry注册服务
只有向RMI registry注册了,才能让远程用户存取(一定要RMI registry一定要注册起来否则运行程序会失败),注册对象时RMI 会把stub加到registry中,这是客户端需要的,使用java.rmi.Naming的rebind()注册服务
try{
     MyRemote service=new MyRemoteIm1();
     Naming.rebind("Remote Hello",service);//将实现的接口类实例向RMI registry注册,帮服务命名(Remote Hello)
}catch(Exception ex){...}
 
 
步骤3:用rmic产生stub
对真正实现的类执行rmic,产生helper类(stub)
会按照命名规则在远程实现的名称后加上_Stub。
rmic MyRemoteImp1
会生成MyRemoteImp1_Stub.class文件
 
 
步骤4:启动RMI registry(rmiregistry)
用户会从此处获得代理(客户端的sub/helper对象)
需要在实现的服务类下去执行命令:rmiregistry
如果想指定端口号,可以通过【rmiregistry 端口号】来启动
 
步骤5:启动远程服务
【java 真正实现的类】启动服务,实现服务的类的实例会向RMI registry注册(注册后才能对用户提供服务)
java MyRemoteImp1
 
指定服务端口号
两种方法:一是程序中指定,二是启动rmiregistry时指定
程序中指定:
 
启动rmiregistry指定:【rmiregistry 端口号】
 
客户端实现
 
客户端获得stub对象
直接将服务器上生成的stub文件拷贝到客户端上即可
 
客户端调用远程方法
通过Naming.lookup()的静态方法寻找某台IP上注册的远程方法(通过Naming.rebind()注册),返回一个stub对象
MyRemote service=(MyRemote) Naming.lookup("rmi://127.0.0.1:服务端口号/Remote Hello");
 
如果Naming.lookup没有指定服务的端口号,则用java默认的1099端口号
 
说明:
1.客户端调用服务必须与服务端使用相同的接口类型
2.Naming.lookup()寻址的格式【rmi://服务器地址/注册的远程方法名】,返回一个stub对象
3.客户端本地一定要有服务端rmic产生的stub类,否则RMI registry返回的stub对象不会被解序列化
 
 
RMI的注意事项
1.在启动远程服务前(java 实现服务的类),必须先启动rmiregistry
2.参数和返回类型必须是可序列化的
3.将stub类交给客户端
4.客户端和服务端一定要能够ping通,否则不能调用
 
遇到的问题
问题:
客户端启动时提示地址非法:java.net.MalformedURLException: invalid URL String: rmi://127.0.0.1:2000/Remote Hello
 
解决方法:
将远程的服务地址转换一下编码格式
String url="rmi://127.0.0.1:2000/Remote Hello";
url= URLEncoder.encode(url, "UTF-8");
MyRemote service=(MyRemote) Naming.lookup(url);
 
 
 

4-java安全基础——rmi远程调用(代码片段)

1.RMI远程调用javaRMI(JavaRemoteMethodInvocation)即远程方法调用,是分布式编程中的一种编程思想,javajdk1.2就开始支持RMI,通过RMI可以实现一个虚拟机中的对象调用另一个虚拟机上中的对象的方法,并且这两个虚拟机可... 查看详情

java基础十[包jar存档文件和部署](阅读headfirstjava记录)

将Java的class文件生成为可执行的Java应用程序。Java应用程序有三种:完全在本机执行的Jar(例如本机的GUI可执行程序);完全在服务器端远程执行的(例如浏览器来进行存取);介于两者之间的组合(例如客户端在本地,与远程... 查看详情

java网络编程基础—rmi分布式网络编程

...法调用的任何对象必须实现该远程接口。EJB就是建立在RMI基础之上的。    本节将讲解RMI的基本概念和系统原理,通过一些入门实例讲解RM 查看详情

我的远程 RMI 呼叫缺少啥?

】我的远程RMI呼叫缺少啥?【英文标题】:WhatamImissingformyremoteRMIcall?我的远程RMI呼叫缺少什么?【发布时间】:2021-12-0602:12:12【问题描述】:我错过了什么?我正在尝试从独立的java应用程序向部署在Jboss6.4EAP中的server-app-ear进行... 查看详情

jboss部署出现jboss.naming.context.java.rmi找不到错误

最近,在机器人程序中使用jmx,准备做个远程调用,客户端是web,部署在jboss上,本地测试的都好好的,发到预发布上就是不行,错误描述:FailedtoretrieveRMIServerstub:javax.naming.NameNotFoundException:rmi://10.6.54.232:9734/ffmmendservice--servicejbos... 查看详情

java中rmi远程调用demo

Java远程方法调用,即JavaRMI(JavaRemoteMethodInvocation),一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全... 查看详情

rmi是干啥用的在java里面

...中的范例,没有其它的选择。直接在你的对象实现上执行远程调用是不可能的,你只能在对象类的接口上单独进行这一操作。所以我们在使用RMI-IIOP时,你必须建立一个客户接口,叫做remoteinterface。这个远程接口应该扩展java.rmi.R... 查看详情

无需 RMI 的内部 Java 客户端的可扩展 POJO 远程服务

】无需RMI的内部Java客户端的可扩展POJO远程服务【英文标题】:ScalablePOJOremoteservicetointernalJavaclientswithoutRMI【发布时间】:2011-04-2715:20:26【问题描述】:我想将POJO公开为高度可扩展的远程服务,以供其他内部Java客户端使用,而无... 查看详情

rmi使用笔记

Java远程方法调用,即JavaRMI(JavaRemoteMethodInvocation)。顾名思义,可以使客户机上运行的程序能够调用远程服务器上的对象(方法)。下面主要介绍一下使用步骤:1.定义远程接口(服务端)远程接口定义出可以让客户远程调用的... 查看详情

RMI 与 Web 服务。 Java2Java 远程处理的最佳选择是啥? [关闭]

】RMI与Web服务。Java2Java远程处理的最佳选择是啥?[关闭]【英文标题】:RMIvs.WebServices.What\'sbestforJava2Javaremoting?[closed]RMI与Web服务。Java2Java远程处理的最佳选择是什么?[关闭]【发布时间】:2010-09-1104:31:12【问题描述】:我是Web服... 查看详情

rmi的实现

 RMI,即RemoteMethodInvoke(远程方法调用)。RMI最初在1.1被引入Java平台中,它为Java开发者提供了一种强大的方法来实现Java程序间的交互。在RMI之前,对于Java开发者来说,远程调用的唯一选择是CORBA或者手工编写Socket程序。 ... 查看详情

java安全初探-rmi篇

JavaRMI初识JavaRMI定义JavaRMI(JavaRemoteMethodInvocation),即Java远程方法调用。是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。JavaRMI使用JRMP(JavaRemoteMessageProtocol,Java远程消息交换协议)实现,使得客户端运行的... 查看详情

java远程调用接口的原理和范例,谢谢

Java远程处理  Java远程方法调用(RMI)提供了Java程序语言的远程通讯功能,这种特性使客户机上运行的程序可以调用远程服务器上的对象,使Java编程人员能够在网络环境中分布操作。  创建一个简单的Java分布式远程方法调用程序... 查看详情

java示例代码_远程关闭Java RMI服务器

java示例代码_远程关闭Java RMI服务器 查看详情

rmi的概念

RMI(RemoteMethodInvocation)远程方法调用是一种计算机之间利用远程对象互相调用实现双方通讯的一种通讯机制。使用这种机制,某一台计算机上的对象可以调用另外一台计算机上的对象来获取远程数据。RMI是EnterpriseJavaBeans的支柱,... 查看详情

常见远程调用协议

...现,采用阻塞式短连接和JDK标准序列化方式,Java标准的远程调用协议。连接个数:多连接连接方式:短连接传输协议:TCP传输方式:同步传输序列化:Java标准二进制序列化适用范围:传入传出参数数据包大小混合,消费者与提... 查看详情

远程调用

一、1.产生的问题描述2.Java中常见的远程调用方式:  Socket、Http、Tcp、Udp、Rpc、Rmi、Jms、WebService...3.常见的框架介绍  ①:Hessian:类似于RMI,使用二进制消息来进行远程调用。与RMI不同的是,它的二进制消息可以在非Java中... 查看详情

spirng整合rmi

  JavaRMI指的是远程方法调用(RemoteMethodInvocation)。它是一种机制,能够让在某个Java虚拟机上的对象调用另一个Java虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。  在spring整合Rmi中:服... 查看详情