「javarmi包」javaRMI
本篇文章给大家谈谈javarmi包,以及javaRMI对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、RMI是干什么用的在JAVA里面
- 2、关于java里rmi包的一点小疑问
- 3、高手进!JAVA中实现RMI必须得把所有CLASS文件放到一个包里么?
- 4、Android平台是否支持RMI,java.rmi包在Android平台上不存在。
- 5、android 怎么使用java rmi
RMI是干什么用的在JAVA里面
RMI是J2EE的网络机制,允许你编写分布式对象,使得对象的通信范围能够在内存中,跨Java虚拟机,跨物理设备
RMI-IIOP遵循了接口和实现的原则。你写的所有网络代码都是应用于接口,而不是实现。实际上,你必须使用RMI-IIOP中的范例,没有其它的选择。直接在你的对象实现上执行远程调用是不可能的,你只能在对象类的接口上单独进行这一操作。
所以我们在使用RMI-IIOP时,你必须建立一个客户接口,叫做remote interface。这个远程接口应该扩展java.rmi.Remote接口。
RMI应用程序通常包括两个独立的程序:服务器程序和客户机程序。典型的服务器应用程序将创建多个远程对象,使这些远程对象能够被引用,然后等待客户机调用这些远程对象的方法。而典型的客户机程序则从服务器中得到一个或多个远程对象的引用,然后调用远程对象的方法。RMI为服务器和客户机进行通信和信息传递提供了一种机制。
在与远程对象的通信过程中,RMI使用标准机制:stub和skeleton。远程对象的stub担当远程对象的客户本地代表或代理人角色。调用程序将调用本地stub的方法,而本地stub将负责执行对远程对象的方法调用。在RMI中,远程对象的stub与该远程对象所实现的远程接口集相同。调用stub的方法时将执行下列操作:(1) 初始化与包含远程对象的远程虚拟机的连接;(2) 对远程虚拟机的参数进行编组(写入并传输);(3) 等待方法调用结果;(4) 解编(读取)返回值或返回的异常;(5) 将值返回给调用程序。为了向调用程序展示比较简单的调用机制,stub将参数的序列化和网络级通信等细节隐藏了起来。在远程虚拟机中,每个远程对象都可以有相应的skeleton(在JDK1.2环境中无需使用skeleton)。Skeleton负责将调用分配给实际的远程对象实现。它在接收方法调用时执行下列操作:(1) 解编(读取)远程方法的参数;(2) 调用实际远程对象实现上的方法;(3) 将结果(返回值或异常)编组(写入并传输)给调用程序。stub和skeleton由rmic编译器生成。
关于java里rmi包的一点小疑问
%BB%E1%B0%A2%A3%AC%B5%B1%D2%BB%B8%F6%B6%D4%CF%F3%B2%BB%B1%BB%C8%CE%BA%CE%D2%FD%D3%C3%CB%F9%D6%B8%CF%F2%CA%B1%BE%CD%BB%E1%B1%BBGC%BB%D8%CA%D5%A3%AC%B1%BE%C0%FD%D6%D0%A3%ACa%B1%BBthis%B6%D4%CF%F3%B3%D6%D3%D0%A3%AC%B5%B1this%B2%BB%D4%D9%B3%D6%D3%D0%D5%E2%B8%F6%D2%FD%D3%C3%CA%B1%A3%ACa%BE%CD%BB%E1%B1%BB%BB%D8%CA%D5%C0%AD
高手进!JAVA中实现RMI必须得把所有CLASS文件放到一个包里么?
首先你得用jdk的rmic命令为你的实现类CalculatorImpl生成存根和框架,将接口,实现类,框架和服务端代码的类放在一个包里;将接口,实现类,存根和客户端的类放在另一个包里(甚至可以在另一台host上);在命令行启动rmiregistry命令,再打开两个命令行窗口,先启动服务器程序,再在另一个窗口启动客户端程序。运行肯定没有问题的,不一定非要在一个包中,那样还叫什么远程访问啊!
Android平台是否支持RMI,java.rmi包在Android平台上不存在。
java.long.NoClassDefFoundError: sun.misc.BASE64Encoder
在与服务器端交互时,服务器端采用sun.misc.BASE64Encoder加密后,Android端找不到这个API。
其API在jdk 1.6下的rt.jar中,有45.6M之巨大。
我们需要使用则需要将其源码抽取出来单独放到客户端。
为了方便重用,我将其打包为一个jar包,以后的工程导入此jar包可以直接使用。
android 怎么使用java rmi
1、定义一个远程接口
IHello.java代码如下:
import java.rmi.Remote;
public interface IHello extends Remote {
public String sayHello(String name) throws java.rmi.RemoteException;
}
2、实现远程的接口(服务端就在此远程接口的实现类中)
HelloImpl.java代码如下:
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class HelloImpl extends UnicastRemoteObject implements IHello {
// 这个实现必须有一个显式的构造函数,并且要抛出一个RemoteException异常
protected HelloImpl() throws RemoteException {
super();
}
/**
* 说明清楚此属性的业务含义
*/
private static final long serialVersionUID = 4077329331699640331L;
public String sayHello(String name) throws RemoteException {
return "Hello " + name + " ^_^ ";
}
public static void main(String[] args) {
try {
IHello hello = new HelloImpl();
java.rmi.Naming.rebind("rmi://localhost:1099/hello", hello);
System.out.print("Ready");
} catch (Exception e) {
e.printStackTrace();
}
}
}
3、新建RMI客户端调用程序
Hello_RMI_Client.java代码如下:
import java.rmi.Naming;
public class Hello_RMI_Client {
public static void main(String[] args) {
try {
IHello hello = (IHello) Naming.lookup("rmi://localhost:1099/hello");
System.out.println(hello.sayHello("zhangxianxin"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
4、编译并运行
4.1 用javac命令编译IHello.java、HelloImpl.java、Hello_RMI_Client.java
javac *.java
4.2 用rmic命令生成桩和框架文件
rmic HelloImpl
成功执行完上面的命令可以发现生成一个HelloImpl_stub.class文件,如果JDK是使用Java2SDK,那么还可以发现多出一个HelloImpl_Skel.class文件。如果服务端程序与客户端程序在同一台机器上并在同一目录中,则可以省略掉接口实现类生成的桩和框架文件,但这就失去了使用RMI的意义,而如果要在不同的JVM上运行时,客户端程序就必须得依靠服务端运程方法实现的桩和框架文件以及接口类。
4.3 运行注册程序RMIRegistry,必须在包含刚写的类的目录下运行这个注册程序。
rmiregistry
注册程序开始运行了,不要管他,现在切换到另外一个控制台运行服务器
4.4 运行服务器HelloImpl
java HelloImpl
当启动成功出现Ready...... 这个服务器就开始工作了,把接口的实现加载到内存等待客户端的联接。现在切换到第三个控制台,启动我们的客户端。
4.5 启动客户端:为了在其他的机器运行客户端程序你需要一个远程接口(IHello.class) 和一个stub(HelloImpl_Stub.class)。 使用如下命令运行客户端
java Hello_RMI_Client
当运行成功会在控制台打印:Hello zhangxianxin() ^_^
备注:如果不想在控制台上开启RMI注册程序RMIRegistry的话,可在RMI服务类程序中添加LocateRegistry.createRegistry(1099); 如下所示:
修改后的HelloImpl.java代码如下:
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;
public class HelloImpl extends UnicastRemoteObject implements IHello {
// 这个实现必须有一个显式的构造函数,并且要抛出一个RemoteException异常
protected HelloImpl() throws RemoteException {
super();
}
private static final long serialVersionUID = 4077329331699640331L;
public String sayHello(String name) throws RemoteException {
return "Hello " + name + " ^_^ ";
}
public static void main(String[] args) {
try {
IHello hello = new HelloImpl();
LocateRegistry.createRegistry(1099); //加上此程序,就可以不要在控制台上开启RMI的注册程序,1099是RMI服务监视的默认端口
java.rmi.Naming.rebind("rmi://localhost:1099/hello", hello);
System.out.print("Ready");
} catch (Exception e) {
e.printStackTrace();
}
}
}
javarmi包的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于javaRMI、javarmi包的信息别忘了在本站进行查找喔。