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.*;
import java.rmi.server.UnicastRemoteObject;
public class HelloImpl extends UnicastRemoteObject implements
Hello
//实现Hello接口
{
private String name;
public HelloImpl (String s ) throws java.rmi.RemoteException{
super(); //调用父类的构造函数
name = s;
}
public String sayHello() throws RemoteException {
return "Hello world!"; //实现Hello接口定义的方法
}
public static void main ( String args [])
{
System.setSecurityManager ( new RMISecurityManager() );
//设置RMI程序需要的安全策略
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.*; public class HelloClient
{
public static void main(String args[])
{
System.setSecurityManager(new RMISecurityManager() );
//设置RMI需要的安全策略
try
{
Hello obj = (Hello) Naming.lookup("HelloServer");
//从服务端获得一个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
4. 在d:\下运行RMI远程对象注册程序
start rmiregistry
5. 在d:\下运行服务器程序
java -Djava.security.policy=my.policy hello.HelloImpl
6. 在d:\下运行客户端程序
java -Djava.security.policy=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将在分布式计算方面大有作为。
|