补充:发现了一个好的例子 放在附件中(RMIDemo.rar),我用这个例子做了一个 让远程 用户修改订单状态的业务(9.27)
概念:
Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。
Java RMI极大地依赖于接口。在需要创建一个远程对象的时候,程序员通过传递一个接口来隐藏底层的实现细节。客户端得到的远程对象句柄正好与本地的根代码连接,由后者负责透过网络通信。这样一来,程序员只需关心如何通过自己的接口句柄发送消息。
接口的两种常见实现方式是:最初使用JRMP(Java Remote Message Protocol,Java远程消息交换协议)实现;此外还可以用与CORBA兼容的方法实现。RMI一般指的是编程接口,也有时候同时包括JRMP和API(应用程序编程接口),而RMI-IIOP则一般指RMI接口接管绝大部分的功能,以支持CORBA的实现。
最初的RMI API设计为通用地支持不同形式的接口实现。后来,CORBA增加了传值(pass by value)功能,以实现RMI接口。然而RMI-IIOP和JRMP实现的接口并不完全一致。
所使用Java包的名字是java.rmi。
开发第一个 RMI 程序:
1. 构造一个远程接口Hello:
package hello;
public interface Hello extends java.rmi.Remote
{
//rmi应用程序必须继承自java.rmi.Remote
String sayHello() throws java.rmi.RemoteException ;
//定义可以远程调用的接口
}
2. 完成server方程序,定义HelloImpl类实现Hello接口:
package hello;
import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class HelloImpl extends UnicastRemoteObject implements Hello
{
private static final long serialVersionUID = 1L;
private String name;
public HelloImpl (String s) throws java.rmi.RemoteException
{
super(); //调用父类的构造函数
this.name = s;
}
public String sayHello() throws RemoteException
{
return "你好,胡晓亮,第一个RMI程序成功了!";
}
public static void main(String[] args)
{
System.setSecurityManager ( new RMISecurityManager());
try
{
HelloImpl obj = new HelloImpl("HelloServer");
//生成一个HelloImpl的实例
Naming.rebind("HelloServer", obj);
//将这个实例绑定到一个名字上
System.out.println("HelloImpl created and bound in the registry to the name HelloServer");
}
catch (Exception e)
{
System.out.println("HelloImpl.main: an exception occured:");
e.printStackTrace(); //产生异常的话,打印出出错信息
}
}
}
server方生成一个远程对象并和一个可和客户对话的名称\"HelloServer\"绑定。Client端可以根据该名称寻找相应的远程对象,进而调用其远程方法。
3. 完成client方程序
package hello;
import java.rmi.Naming;
import java.rmi.RMISecurityManager;
public class HelloClient
{
public static void main(String args[])
{
System.setSecurityManager(new RMISecurityManager());
//设置RMI需要的安全策略
try
{
String remoteHost="169.254.11.186";
String rmiServerPort="1099";
String bindUrl = "rmi://"+remoteHost+":"+rmiServerPort+"/HelloServer";
System.out.println("bindUrl:"+bindUrl);
Hello obj = (Hello) Naming.lookup(bindUrl);
//从服务端获得一个Hello的远程对象
String message = obj.sayHello();
//远程调用Hello的方法
System.out.println(message);
//将输出结果打印
}
catch(Exception e)
{
System.out.println("Hello client : an exception occured");
e.printStackTrace();
}
}
}
client利用java.rmi包中的Naming类的lookup()方法获得远程对象obj,然后调用其远程方法sayHello()获得字符串\"Hello World\",并输出到屏幕上。
要运行这几个程序,还有一些工作要做,这几个程序的文件名为Hello.java、HelloImpl.java、HelloClient.java,它们都被放置在的的d:\\hello目录下,在windows下,你需要在命令窗口中如此运行它们:
1. Set CLASSPATH = %CLASSPATH%;d:\\
2. 在d:\\hello下编译源代码:
javac -d .. *.java
3. 在生成端头和框架模块,首先把目录切换回d:\\
rmic -d . hello.HelloImpl //在这里我出错了,原因是我的path是C:\MinGW\bin开头,使用了这个rmic编译当然会出错,应该吧C:\Java\jdk1.5.0_07\bin 放在前面
4. 在d:\\下运行RMI远程对象注册程序
start rmiregistry
5. 在d:\\下运行服务器程序
java -Djava.security.policy=d:\hello\my.policy hello.HelloImpl
6. 在d:\\下运行客户端程序
java -Djava.security.policy=d:\hello\my.policy hello.HelloClient
其中上面的步骤中5和6出现的my.policy是一个文件,这个文件和Java的安全机制有关,在这个程序中我们不需要安全限制,所以我们把权限设为都可以访问。my.policy如下:
grant {
permission java.security.AllPermission;
};
你一定要记得设置这个文件,否则RMI将出\"拒绝访问\"的错误。如果你想了解Java其他的安全机制,那么可以参考Java里有关security的资料。
RMI属于Java高级技术的一种,通过本小节的学习,你应该已经对RMI有了一定的了解,分布式计算是一个很重要的技术,而Java在分布式计算方面有着很好的前景,以RMI为基础,Java将在分布式计算方面大有作为。
测试发现不能跨JVM调用,我估计是 my.policy 的问题,没有继续研究,哪个网友运行我的例子后 能解决这个问题麻烦给我留言,先谢谢了
参考:
http://www.zxbc.cn/html/20070419/5097.html