这是看网上例子写的,记录了编写过程和全部源代码
感觉不是一般的难用啊,配来配去的,不是很方便…………
RMI:使客户端能够调用调用服务器端的对象的方法。
先看一下服务器端的需要做的事情。
1 被客户端调用的类。
这里包括两部分:
1 一个接口,定义了可以被客户端调用的方法。
2 一个类,实现了上面接口的类。
接口必须实现java.rmi.Remove
完整代码:
package com.hf.rmi.server.test;
import java.rmi.*;
public interface PerfectTimeI extends Remote {
long getPerfectTime() throws RemoteException;
}
类:
package com.hf.rmi.server.test;
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
import java.net.*;
public class PerfectTime extends UnicastRemoteObject implements PerfectTimeI {
public long getPerfectTime()
throws RemoteException {
return System.currentTimeMillis();
}
public PerfectTime() throws RemoteException {
super();
}
public static void main(String[] args) {
System.setSecurityManager(
new RMISecurityManager());
try {
PerfectTime pt = new PerfectTime();
Naming.rebind(
"//172.168.1.141:2005/PerfectTime" , pt);
System.out.println("Ready to do time");
} catch(Exception e) {
e.printStackTrace();
}
}
}
继承了UnicastRemoteObject并且实现了上面定义的接口。
为了方便,直接在当前类的main方法中创建了对象并启动了绑定
调用rmic命令创建stub
Rmic com.hf.rmi.server.test.PerfectTime
这就会生成两个类:PerfectTime_Skel.class,PerfectTime_Stub.class。其中第二个我们在客户端需要用到。
下面看一下客户端代码:
首先创建一个调用服务器端的类:
package com.hf.rmi.client.test;
import java.rmi.*;
import com.hf.rmi.server.test.PerfectTimeI;
public class DisplayPerfectTime {
public static void main(String[] args) {
System.setSecurityManager(
new RMISecurityManager());
try {
PerfectTimeI t =
(PerfectTimeI)Naming.lookup(
"rmi://172.168.1.141:2005/PerfectTime");
for(int i = 0 ; i < 10; i++)
System.out.println("Perfect time =" +
t.getPerfectTime());
} catch(Exception e) {
e.printStackTrace();
}
}
}
我们需要注意的是:在里面用到了PerfectTimeI 类。这个其实就是服务器端的那一个类。直接从服务器端拷过来就成了,注意要放到和服务器端相同的包下。
再将PerfectTime_Stub.class拷贝过来,也放置到同服务器端一致的位置上。
下面我们需要修改一下jdk的一些设置,
在jdk目录下的这个文件/YOUR_JDK_PATH/jre/lib/security/java.policy
的最后加入下面代码:
grant {
permission java.net.SocketPermission "*:1024-65535",
"connect,accept";
permission java.net.SocketPermission "*:80","connect";
据说是开放了端口权限
接下来我们需要启动rmi
2 start rmiregistry 2005
运行服务器端程序:
cd D:/eclipse/workspace/RMIServer
进入服务器端路径
运行
Java -Djava.rmi.server.codebase=file:/D:/eclipse/workspace/RMIServer/ com.hf.rmi.server.test.PerfectTime
这里的“-Djava.rmi.server.codebase=file:/D:/eclipse/workspace/RMIServer/”主要是用来指定残根所在的位置。
这时候就会启动服务了。
cd D:/eclipse/workspace/RMIClient
运行 java com.hf.rmi.client.test.DisplayPerfectTime